HDU 3342--拓扑排序

http://acm.hdu.edu.cn/showproblem.php?pid=3342

拓扑排序的水题,利用拓扑排序判环。

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 #define maxn 1005
 5 int g[1005][1005];
 6 int top,vis[maxn],rudu[maxn],n;
 7 void topo()
 8 {
 9     int i;
10     for(i=0;i<n;i++)
11     {
12         if(!rudu[i]&&!vis[i])
13         {
14             vis[i]=1;
15             top=i;
16             break;
17         }
18     }
19     for(i=0;i<n;i++)
20     {
21         if(g[top][i])
22             rudu[i]--;
23     }
24 }
25 int main()
26 {
27     int m,a,b,i;
28     while(cin>>n>>m,n||m)
29     {
30         memset(rudu,0,sizeof(rudu));
31         memset(g,0,sizeof(g));
32         memset(vis,0,sizeof(vis));
33         while(m--)
34         {
35             cin>>a>>b;
36             if(!g[a][b])
37                 rudu[b]++;
38             g[a][b]=1;
39         }

40         for(i=0;i<n;i++)
41         {
42             top=1001;
43             topo();
44             if(top==1001)
45                 break;
46         }
47         if(i>=n)
48             puts("YES");
49         else
50             puts("NO");
51     }
52     return 0;
53 }

 

posted on 2013-02-04 20:10  acoderworld  阅读(62)  评论(0)    收藏  举报

导航