判断给定图是否存在合法拓扑序列

题目:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2140&cid=1186

 1 #include<stdio.h>
 2 #include<string.h>
 3 int d[15],map[15][15],vis[15];
 4 int main()
 5 {
 6     int i,j,k,f,n,m,u,v;
 7     while(~scanf("%d%d",&n,&m))
 8     {
 9         memset(d,0,sizeof(d));
10         memset(map,0,sizeof(map));
11         memset(vis,0,sizeof(vis));
12         for(i=1; i<=m; i++)
13         {
14             scanf("%d%d",&u,&v);
15             map[u][v]=1;
16             d[v]++;
17         }
18         for(i=1; i<=n; i++)
19         {
20             f=0;
21             for(j=1; j<=n; j++)
22             {
23                 if(d[j]==0&&vis[j]==0)
24                 {
25                     vis[j]=1;
26                     for(k=1; k<=n; k++)
27                     if(map[j][k])
28                     d[k]--;
29                     f=1;
30                     break;//找到一个入度为0的就结束
31                 }
32             }
33             if(f==0)//如果节点未输出完,而图中就没有了入度为0的节点,则说明有环,不合法。
34             break;
35         }
36         if(f==0)
37         printf("NO\n");
38         else
39         printf("YES\n");
40     }
41 }

 

posted @ 2013-06-29 23:13  水门  阅读(369)  评论(0编辑  收藏  举报