这里要引入两个概念:
1.树边:是一条未被遍历过的边,它指向一个未被访问过的点。
2.反向边:是一条未被遍历过的边,它指向一个被访问过的点。
如果图中有环路的存在,那么环路的最后一个边必然是一条反向边。
我的参考
那么,我们在DFS遍历的过程当中,只需要添加一条语句来判断所有未被检查过的边的指向点是否已被访问过,就可以判断出这个图是否存在环路了。
1 struct Edge { 2 int to, w, next; 3 }; 4 5 struct adjTable { 6 int node[maxv]; 7 int visit[maxe]; 8 int cnt; 9 bool cycle; 10 struct Edge e[maxe]; 11 void init() { 12 memset(node, -1, sizeof(node)); 13 memset(visit, 0, sizeof(visit)); 14 cnt = 0; 15 cycle = false; 16 } 17 void addedge(int u,int v) { 18 e[cnt].to = v; 19 e[cnt].next = node[u]; 20 node[u] = cnt++; 21 } 22 void read() { 23 int n, u, v, w; 24 scanf("%d", &n); 25 for (int i=1; i<=n; i++) { 26 scanf("%d %d", &u, &v); 27 addedge(u, v); 28 } 29 return ; 30 } 31 void dfs(int p) { 32 int i; 33 for (i=node[p]; i!=-1; i=e[i].next) { 34 if ( visit[e[i].to] )//判断第i条边是否为反向边 35 cycle = true; //dfs运行之后就可以根据cycle的true还是false来判断环路是否存在了 36 if (visit[ e[i].to ] == 0) { 37 printf("%d %d\n", p, e[i].to); 38 visit[ p ] = 1; 39 dfs( e[i].to ); 40 } 41 } 42 } 43 };
时间: 2024-10-01 07:09:01