hdu1285确定比赛名次<拓扑排序>

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

拓扑排序是对有向无环图的一种排序。表示了顶点按边的方向出现的先后顺序。如果有环,则无法表示两个顶点的先后顺序。

拓扑排序方法如下:

  (1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.

  (2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.

  (3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.

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 void Topsort(int top )

19 {

20     int i,flag;

21     while( top<N ){

22         for( i=1; i<=N; ++ i){

23             if( !v[i]&&in[i]==0 )

24                 break;

25         }

26         if( i>N && top<N ){

27             flag=1;  //成环  本题没有成环 

28             break;

29         }

30         top++;

31         v[i]=1;

32         printf( top==N?"%d\n":"%d ", i );

33         for( int j=1; j<=N; ++ j ){  //与i相连的j入度 -1; 

34             if( map[i][j]&& in[j] )

35                 in[j]--;

36         }

37     }

38     

39 }

40 int main( )

41 {

42     while(scanf( "%d%d", &N, &M ) ==2 ){

43         Init( );

44         Topsort(0);    

45     }

46     return 0;

47 }

 

 

你可能感兴趣的:(HDU)