判断一个图中有无环路的存在
生活随笔
收集整理的這篇文章主要介紹了
判断一个图中有无环路的存在
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
這里要引入兩個(gè)概念:
1.樹(shù)邊:是一條未被遍歷過(guò)的邊,它指向一個(gè)未被訪問(wèn)過(guò)的點(diǎn)。
2.反向邊:是一條未被遍歷過(guò)的邊,它指向一個(gè)被訪問(wèn)過(guò)的點(diǎn)。
如果圖中有環(huán)路的存在,那么環(huán)路的最后一個(gè)邊必然是一條反向邊。
?
那么,我們?cè)贒FS遍歷的過(guò)程當(dāng)中,只需要添加一條語(yǔ)句來(lái)判斷所有未被檢查過(guò)的邊的指向點(diǎn)是否已被訪問(wèn)過(guò),就可以判斷出這個(gè)圖是否存在環(huán)路了。
?
#include <stdio.h> #include <string.h>const int maxv = 1000; const int maxe = 5000; const int maxn = 1000; /* * 鄰接矩陣 * */ struct adjMetrix {int G[maxn+10][maxn+10];int visit[maxn];int n;void addedge(int u, int v) {G[u][v] = 1;return ;}void read() {memset(G, 0, sizeof(G));memset(visit, 0, sizeof(visit));int u, v, w;scanf("%d", &n);for (int i=0; i<n; i++) {scanf("%d %d", &u, &v);addedge(u, v);}return ;}void dfs(int i) {for (int j=0; j<=n; j++) {if (G[i][j]!=0 && visit[j]==0) {printf("%d %d\n", i, j);visit[j] = 1;dfs(j);}}} };/* * 鄰接鏈表 * */ struct Edge {int to, w, next; };struct adjTable {int node[maxv];int visit[maxe];int cnt;bool cycle;struct Edge e[maxe];void init() {memset(node, -1, sizeof(node));memset(visit, 0, sizeof(visit));cnt = 0;cycle = false;}void addedge(int u,int v) {e[cnt].to = v;e[cnt].next = node[u];node[u] = cnt++;}void read() {int n, u, v, w;scanf("%d", &n);for (int i=1; i<=n; i++) {scanf("%d %d", &u, &v);addedge(u, v);}return ;}void dfs(int p) {int i;for (i=node[p]; i!=-1; i=e[i].next) {if ( visit[e[i].to] )cycle = true;if (visit[ e[i].to ] == 0) {printf("%d %d\n", p, e[i].to);visit[ p ] = 1;dfs( e[i].to );}}} };struct adjTable table;int main() {freopen("in.txt", "r", stdin);table.init();table.read();table.dfs(1);if (table.cycle)printf("有環(huán)!\n");elseprintf("無(wú)環(huán)!\n");return 0; }?
?
轉(zhuǎn)載于:https://www.cnblogs.com/marginalman/p/4742704.html
總結(jié)
以上是生活随笔為你收集整理的判断一个图中有无环路的存在的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 4、Cocos2dx 3.0三,找一个小
- 下一篇: Tomcat配置JNDI数据源