hdu 1285 确定比赛名次 拓扑排序

确定比赛名次

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 5   Accepted Submission(s) : 2

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。

Input

输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。

Output

给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。

其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。

Sample Input

4 3

1 2

2 3

4 3

Sample Output

1 2 4 3

拓扑排序,每次把入度为0的点输出,并删除这个点。
代码:
View Code
 1 #include <iostream>

 2 #include <iostream>

 3 #include <stdio.h>

 4 using namespace std;

 5 

 6 int map[505][505],indegree[505];

 7 

 8 void Topo(int n)

 9 {

10     int ans,i,j,flag=0;

11     for(i=1;i<=n;i++)

12     {

13         for(j=1;j<=n;j++)

14         {

15             ans=n;

16             if(indegree[j]==0)

17             {

18                 flag++;

19                 indegree[j]--;

20                 ans=j;

21                 if(flag!=n)

22                     printf("%d ",ans);

23                 else 

24                 {

25                     printf("%d\n",ans);

26                     return ;

27                 }

28                 break;

29             }

30         }

31         for(j=1;j<=n;j++)

32         {

33             if(map[ans][j]>0)

34             {

35                 indegree[j]--;

36             }

37         }

38     }

39 }

40 

41 int main()

42 {

43     int i,j,n,m,flag;

44     while(scanf("%d%d",&n,&m)!=EOF)

45     {

46         int p,q;

47         memset(map,0,sizeof(map));

48         memset(indegree,0,sizeof(indegree));

49         for(i=0;i<m;i++)

50         {

51             scanf("%d%d",&p,&q);

52             if(map[p][q]==0)

53             {

54                 map[p][q]=1;

55                 indegree[q]++;

56             }

57         }

58         Topo(n);

59     }

60     return 0;

61 }

 

你可能感兴趣的:(HDU)