1. 程式人生 > >hdu 1285 確定比賽名次 (topsort)

hdu 1285 確定比賽名次 (topsort)

== iostream pri math its limits problem -- main

確定比賽名次
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 36309 Accepted Submission(s): 14221
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

C/C++:

 1 #include <map>
 2 #include <queue>
 3 #include <cmath>
 4 #include <vector>
 5 #include <string>
 6 #include <cstdio>
 7 #include <cstring>
 8 #include <climits>
 9 #include <iostream>
10 #include <algorithm>
11 #define INF 0xffffff
12
using namespace std; 13 14 const int my_max_N = 505; 15 int my_indeg[my_max_N], n, m, a, b; 16 vector <int> my_G[my_max_N]; 17 18 void topsort() 19 { 20 queue <int> Q, ans; 21 22 while (1) 23 { 24 for (int i = 1; i <= n; ++ i) 25 if (my_indeg[i] == 0)
26 { 27 Q.push(i), ans.push(i); 28 my_indeg[i] = -1; 29 break; 30 } 31 32 if (Q.empty()) break; 33 while (!Q.empty()) 34 { 35 int my_now = Q.front(); 36 for (int i = 0; i < my_G[my_now].size(); ++ i) 37 -- my_indeg[my_G[my_now][i]]; 38 my_G[my_now].clear(); 39 Q.pop(); 40 } 41 } 42 43 /** 44 Answer Output 45 */ 46 printf("%d", ans.front()); 47 ans.pop(); 48 while (!ans.empty()) 49 { 50 printf(" %d", ans.front()); 51 ans.pop(); 52 } 53 printf("\n"); 54 } 55 56 int main() 57 { 58 while (~scanf("%d%d", &n, &m)) 59 { 60 memset(my_indeg, 0, sizeof (my_indeg)); 61 62 while (m --) 63 { 64 scanf("%d%d", &a, &b); 65 my_G[a].push_back(b); 66 ++ my_indeg[b]; 67 } 68 69 topsort(); 70 } 71 return 0; 72 }

hdu 1285 確定比賽名次 (topsort)