#include <stdlib.h> #include <stdio.h> #define MAX_NUM 10 //最多可存储的顶点数 const int NUL = -1; const int FALSE = -1; const int TRUE = 0; int visited[MAX_NUM]; //访问标志组 typedef struct { int vexs[MAX_NUM]; //顶点数组 int arcs[MAX_NUM][MAX_NUM]; //邻接矩阵 int vexnum, arcnum; //顶点个数 / 弧线个数 }MGraph; int CreateUDN(MGraph *_G) { int i=0, j=0; int v1=0, v2=0; //弧线两端的顶点及弧线权重 printf("Please enter _G->vexnum, _G->arcnum \n"); scanf("%d %d", &(_G->vexnum), &(_G->arcnum)); for(i=0; i<_G->vexnum; i++) //赋值顶点数组 scanf("%d", &(_G->vexs[i])); printf("Init _G->vexs OK \n"); for(i=0; i<_G->vexnum; i++) //初始化邻接矩阵 for(j=0; j<_G->vexnum; j++) _G->arcs[i][j] = 0; printf("Init _G->vexnum OK \n"); for(i=0; i<_G->arcnum; i++) //邻接矩阵赋值 { scanf("%d %d", &v1, &v2); _G->arcs[v1][v2] = v1 + v2; _G->arcs[v2][v1] = v1 + v2; } printf("Set _G->arcnum OK \n"); } /* 获取v的第一个邻接顶点 */ int FirstAdjVex(const MGraph *_G, int _v) { int i = 0; for(i=_v+1; i<_G->vexnum; i++) { if(_G->arcs[_v][i]) if(visited[i] == FALSE) return i; } return -1; } /* 获取v的下一个(费第一个)邻接顶点 */ int NextAdjVex(const MGraph *_G, int _v) { int i = 0; for(i=_v+1; i<_G->vexnum; i++) { if(_G->arcs[_v][i]) if(visited[i] == FALSE) return i; } return -1; } /* 深度优先遍历G */ void DFS(MGraph *_G, int _v) { int w = 0; visited[_v] = TRUE; printf("%d ", _G->vexs[_v]); for(w=FirstAdjVex(_G, _v); w>=0; w=NextAdjVex(_G, _v)) { if(visited[w] == FALSE) DFS(_G, w); } } void DFSTraverse(MGraph *_G) { int v = 0; for(v=0; v<_G->vexnum; v++) visited[v] = FALSE; for(v=0; v<_G->vexnum; v++) { if(visited[v] == FALSE) DFS(_G, v); } } int main(void) { MGraph G; CreateUDN(&G); DFSTraverse(&G); exit(0); }
深度优先遍历图(DFS)
猜你喜欢
转载自www.cnblogs.com/MrRS/p/9080305.html
周排行