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 }

 

 

posted @ 2012-08-01 11:29  淡墨æ末央  阅读(127)  评论(0编辑  收藏  举报