Hdu - 1285 - 肯定比賽名次

先上題目編程

肯定比賽名次

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


ide

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
相關文章
相關標籤/搜索