拓扑排序 判断给定图是否存在合法拓扑序列 自家oj1393

 1 //拓扑排序判断是否有环
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<string.h>
 5 #include<math.h>
 6 #include<queue>
 7 using namespace std;
 8 typedef long long ll;
 9 const int maxn=1e2+10;
10 int G[maxn][maxn];
11 int in[maxn];
12 void init()
13 {
14     memset(G,0,sizeof(G));  //
15     memset(in,0,sizeof(in));  //入度
16 }
17 int Toposort(int n)
18 {
19     int aim;
20     int cot=0;
21     int flag=1;  //1的时候表示有序
22     //每一次循环,找出入度为0的点,如果找不到就证明有环(这点强行记忆)
23     //找到之后,将这个点所连的边的另一个端点入度-1;
24     //算法结束
25     for(int i=1;i<=n;i++){
26         int num=0;
27         for(int j=1;j<=n;j++)
28             if(!in[j]){
29                 num++;
30                 aim=j;
31                 break;
32             }
33         if(!num) return 0;  //有环;
34         in[aim]=-1;
35         for(int j=1;j<=n;j++)
36             if(G[aim][j]) in[j]--;
37     }
38     return flag;
39 
40 }
41 int main()
42 {
43     int n,m;
44     while(scanf("%d%d",&n,&m)!=EOF){
45         init();  //初始化
46         for(int i=1;i<=m;i++){
47             int u,v;
48             scanf("%d%d",&u,&v);
49             G[u][v]=1;
50             in[v]++;  //u到v有边  所以v的入度++;
51         }
52         int flag=Toposort(n);
53         if(flag==1) printf("YES\n");
54         else printf("NO\n");
55     }
56     return 0;
57 }

.

posted @ 2019-11-10 23:46  古比  阅读(192)  评论(0编辑  收藏  举报