HDU 1285-确定比赛名次(拓扑排序)

来源:互联网 发布:mac对应pin码查询网 编辑:程序博客网 时间:2024/06/05 09:38

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285

确定比赛名次

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


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 31 22 34 3
 

Sample Output
1 2 4 3
//简单的拓扑排序, 31ms#include <stdio.h>#include <string.h>#define maxn 505bool vit[maxn][maxn];  //存图int deg[maxn];     //入度void toposort(int n){for(int i=1; i<=n; i++){int u;for(int j=1; j<=n; j++){if(deg[j]==0){deg[j]--;u = j;if(i!=n){printf("%d ", u);}elseprintf("%d\n", u);break;}}for(int j=1; j<=n; j++){if(vit[u][j]){deg[j]--;}}}}int main(){int N, M;while(~scanf("%d%d", &N, &M)){memset(vit, false, sizeof(vit));memset(deg, 0, sizeof(deg));for(int i=0; i<M; i++){int a, b;scanf("%d%d", &a, &b);//如果被同一个人打败多次, 则只记录一个if(!vit[a][b]){vit[a][b] = true;deg[b]++;}}toposort(N);}return 0;}


//用优先队列优化, 15ms
//用优先队列实现拓扑排序#include <stdio.h>#include <string.h>#include <queue>#include <vector>#include <algorithm>#define maxn 505using namespace std;int deg[maxn];vector<int>vec[maxn];void toposort(int n){priority_queue<int, vector<int>, greater<int> >q;while(!q.empty())q.pop();for(int i=1; i<=n; i++)if(deg[i]==0){q.push(i);deg[i]--;}int k = 1;while(!q.empty()){int u = q.top();q.pop();int l = vec[u].size();printf("%d%c", u, k++ == n ? '\n' : ' ');//输出for(int i=0; i<l; i++){deg[vec[u][i]]--;if(deg[vec[u][i]]==0)q.push(vec[u][i]);}}}int main(){int N, M;while(scanf("%d%d", &N, &M)!=EOF){for(int i=0; i<maxn; i++){vec[i].clear();deg[i] = 0;}for(int i=0; i<M; i++){int a, b;scanf("%d%d", &a, &b);vector<int>::iterator it;it = find(vec[a].begin(), vec[a].end(), b);if(it==vec[a].end()){vec[a].push_back(b);deg[b]++;}}toposort(N);}return 0;}