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

Posted pangbi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拓扑排序 判断给定图是否存在合法拓扑序列 自家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
");
54         else printf("NO
");
55     }
56     return 0;
57 }

.

以上是关于拓扑排序 判断给定图是否存在合法拓扑序列 自家oj1393的主要内容,如果未能解决你的问题,请参考以下文章

2140=数据结构实验之图论十:判断给定图是否存在合法拓扑序列

5.6 拓扑排序

有向无环图的判定及拓扑排序

拓扑排序 编程

A 1146 Topological Order (25分)(拓扑排序)

一个有向无环图的拓扑排序序列是否唯一的