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 }