拓扑排序 判断给定图是否存在合法拓扑序列 自家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 }
.