標籤:
題目連結:
http://acm.hdu.edu.cn/showproblem.php?pid=5154
題解:
有向圖判環。
1、用dfs,正在訪問的節點標記為-1,已經訪問過的節點標記為1,沒有訪問過的節點標記為0,如果訪問到-1的節點說明說有環。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 typedef long long LL; 7 8 int n,m; 9 10 const int maxm=10000+10;11 const int maxn=111;12 13 struct Edge{14 int v,ne;15 Edge(int v,int ne):v(v),ne(ne){}16 Edge(){}17 }egs[maxm];18 19 int head[maxn],tot;20 int vis[maxn];21 22 void addEdge(int u,int v){23 egs[tot]=Edge(v,head[u]);24 head[u]=tot++; 25 }26 27 bool dfs(int cur){28 vis[cur]=-1;29 int p=head[cur];30 while(p!=-1){31 Edge &e=egs[p];32 if(vis[e.v]==0){33 if(dfs(e.v)) return true;34 }35 else if(vis[e.v]==-1){36 return true;37 } 38 p=e.ne;39 }40 vis[cur]=1;41 return false;42 }43 44 void init(){45 memset(head,-1,sizeof(head));46 memset(vis,0,sizeof(vis));47 tot=0;48 }49 50 int main(){51 while(scanf("%d%d",&n,&m)==2&&n){52 init();53 while(m--){54 int u,v;55 scanf("%d%d",&u,&v);56 addEdge(u,v);57 } 58 int su=1;59 for(int i=1;i<=n;i++){60 if(vis[i]==0){61 if(dfs(i)){62 su=0; break;63 }64 } 65 }66 if(su) puts("YES");67 else puts("NO"); 68 }69 return 0;70 }
2、拓撲排序。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 using namespace std; 7 typedef long long LL; 8 9 int n, m;10 11 const int maxm = 10000 + 10;12 const int maxn = 111;13 14 struct Edge {15 int v, ne;16 Edge(int v, int ne) :v(v), ne(ne) {}17 Edge() {}18 }egs[maxm];19 20 int head[maxn], tot;21 int ind[maxn];22 23 void addEdge(int u, int v) {24 egs[tot] = Edge(v, head[u]);25 head[u] = tot++;26 }27 28 void init() {29 memset(head, -1, sizeof(head));30 memset(ind, 0, sizeof(ind));31 tot = 0;32 }33 34 int main() {35 while (scanf("%d%d", &n, &m) == 2 && n) {36 init();37 while (m--) {38 int u, v;39 scanf("%d%d", &u, &v);40 addEdge(u, v);41 ind[v]++;42 }43 queue<int> q;44 for (int i = 1; i <= n; i++) {45 if (ind[i] == 0) q.push(i);46 }47 while (!q.empty()) {48 int u = q.front(); q.pop();49 //printf("v:%d\n", v);50 int p = head[u];51 while (p != -1) {52 Edge& e = egs[p];53 ind[e.v]--;54 if (ind[e.v] == 0) q.push(e.v);55 p = e.ne;56 }57 }58 int su = 1;59 for (int i = 1; i <= n; i++) {60 if (ind[i]) { su = 0; break; }61 }62 if (su) puts("YES");63 else puts("NO");64 }65 return 0;66 }
HDU 5154 Harry and Magical Computer 有向圖判環