hdu 1285 确定比赛名次 (topsort)
确定比赛名次
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 36309 Accepted Submission(s): 14221
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队。
输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。
Output
给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。
给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。
其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
Sample Input
4 3
1 2
2 3
4 3
4 3
1 2
2 3
4 3
Sample Output
1 2 4 3
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 }