码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 5154 Harry and Magical Computer 有向图判环

时间:2016-04-29 23:32:04      阅读:346      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

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 有向图判环

标签:

原文地址:http://www.cnblogs.com/fenice/p/5447782.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!