hdu 3342 Legal or Not <拓扑排序>

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

题意 :拓扑排序判断是否成环。

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 int map[501][501], v[501], in[501], M, N;
 4 void Init( )
 5 {
 6     memset( map, 0, sizeof map );
 7     memset( in, 0, sizeof in );
 8     memset( v, 0, sizeof v );
 9     int a, b;
10     for(int i=0; i<M; ++ i  ){
11         scanf("%d%d", &a, &b);
12         if(!map[a][b]){  //判断是否重边 
13             map[a][b]=1;
14             in[b]++;   //入度 +1 
15         }
16     }
17 }
18 int  Topsort(int top )
19 {
20     int i, j, k;
21     for( i=0; i<N; ++ i ){
22         for(  j=0; j<N; ++ j ){
23             if( !v[j]&&in[j]==0 )break;
24         }
25         if( j==N ){
26             return 0;// i<N 还有没有找到的点  j>=N,没有入度为0的点了 
27         }
28         else{
29             v[j]=1;
30             for( k=0; k<N;++k ){
31                 if(map[j][k] && in[k])
32                     in[k]--;
33             }
34         }
35     }
36     return 1;
37     
38 }
39 int main( )
40 {
41     while(scanf( "%d%d", &N, &M ) ==2,M+N ){
42         Init( );
43         int f=Topsort(1);
44         if( f )puts( "YES" );
45         else puts( "NO");    
46     }
47     return 0;
48 }
原文地址:https://www.cnblogs.com/jian1573/p/2618082.html