Hdu - 1285 - 确定比赛名次

先上题目

确定比赛名次

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7800    Accepted Submission(s): 3014


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
 
 
 
  题目很简单,就是一条拓扑排序,只是不确定前后关系的时候按照编号的大小,从小到大排一次,这里只需要用优先队列即可,当然,也可以不使用优先队列,只是考虑到时间复杂度,以及优先队列可以直接调用STL。用它定义好的算子也可以,我这里用的是自己写的算子。
  这一题最让人意想不到的地方就是有重边,就是同一条边读了两次,如果处理不好就会出错。因为这里wa了两次= =。看来以后遇到拓扑排序要注意一下位置。
 
上代码:
 
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <queue>
 4 #define MAX 550
 5 using namespace std;
 6 
 7 int s[MAX][MAX];
 8 
 9 
10 struct cmp
11 {
12     bool operator() (int x,int y)
13     {
14         return x>y;
15     }
16 };
17 
18 priority_queue<int , vector<int>,cmp > p;
19 
20 
21 void deal(int n)
22 {
23     int i,j;
24     queue<int> q;
25     for(i=1;i<=n;i++) if(!s[i][0]) p.push(i);
26     while(!p.empty())
27     {
28         i=p.top();
29         q.push(i);
30         p.pop();
31         for(j=1;j<=n;j++)
32         {
33             if(s[i][j])
34             {
35                 s[j][0]--;
36                 if(!s[j][0]) p.push(j);
37             }
38         }
39     }
40     i=0;
41     while(!q.empty())
42     {
43         if(i++) printf(" ");
44         printf("%d",q.front());
45         q.pop();
46     }
47     printf("\n");
48 }
49 
50 int main()
51 {
52     int n,m,i,x,y;
53     while(scanf("%d %d",&n,&m)!=EOF)
54     {
55         memset(s,0,sizeof(s));
56         for(i=0;i<m;i++)
57         {
58             scanf("%d %d",&x,&y);
59             if(s[x][y]) continue;
60             s[x][y]=1;
61             s[y][0]++;
62         }
63         deal(n);
64     }
65     return 0;
66 }
1285

 

posted @ 2013-07-15 18:49  海拉鲁的林克  阅读(360)  评论(0编辑  收藏  举报