首页 > 代码库 > HDU1285 确定比赛名次

HDU1285 确定比赛名次

拓扑排序:

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。 通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
拓扑排序的实现方法:
(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.
(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.

技术分享
 1 #include<stdio.h>
 2 #include<memory.h>
 3 
 4 int map[507][507];
 5 int in[507];
 6 int topsort[507];
 7 
 8 int n,m,i,j;
 9 
10 void tsort()
11 {
12     for(i=1;i<=n;i++)
13         {
14             int k =1;
15             while(in[k]!=0) k++;
16             in[k] = -1;
17 
18             topsort[i] = k;
19             for(j=1;j<=n;j++)
20             {
21                 if(map[k][j]==1){
22                     in[j]--;
23                 }
24             }
25         }
26 }
27 int main(){
28     while(scanf("%d%d",&n,&m)!=EOF)
29     {
30         int a,b;
31         memset(map,0,sizeof(map));
32         memset(in,0,sizeof(in));
33         memset(topsort,0,sizeof(topsort));
34         for(i=0;i<m;i++)
35         {
36             scanf("%d%d",&a,&b);
37             if(map[a][b] == 0)
38             {
39                 map[a][b] = 1;
40                 in[b]++;
41             }
42         }
43         tsort();
44         for(i=1;i<n;i++)
45             printf("%d ",topsort[i]);
46         printf("%d\n",topsort[i]);
47     }
48 }
View Code

 

HDU1285 确定比赛名次