首页 / 算法 / 算法笔记-问题 B: 确定比赛名次
算法笔记-问题 B: 确定比赛名次
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了算法笔记-问题 B: 确定比赛名次,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1616字,纯文字阅读大概需要3分钟。
内容图文
问题 B: 确定比赛名次
题目描述
有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。
输入
输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。
输出
给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。
其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
样例输入 Copy
3 2 3 1 3 2 17 16 16 1 13 2 7 3 12 4 12 5 17 6 10 7 11 8 11 9 16 10 13 11 15 12 15 13 17 14 17 15 17 16 0 0
样例输出 Copy
3 1 2 17 6 14 15 12 4 5 13 2 11 8 9 16 1 10 7 3
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 510;
vector<int> G[maxn];
int n, m, inDegree[maxn];
void tuopuSort(){
int num = 0;
vector<int> ans;
priority_queue<int, vector<int>, greater<int> > q;
for(int i=1; i<=n; i++){
if(inDegree[i]==0){
q.push(i);
}
}
while(!q.empty()){
int u = q.top();
ans.push_back(u);
q.pop();
for(int i=0; i<G[u].size(); i++){
int v = G[u][i];
inDegree[v]--;
if(inDegree[v]==0){
q.push(v);
}
}
G[u].clear();
num++;
}
for(int i=0; i<ans.size(); i++){
if(i!=ans.size()-1)
printf("%d ", ans[i]);
else
printf("%d\n", ans[i]);
}
}
int main(){
while(scanf("%d%d", &n, &m)!=EOF){
if(n==0&&m==0) break;
memset(inDegree, 0, sizeof(inDegree));
for(int i=0; i<m; i++){
int a, b;
scanf("%d%d", &a, &b);
G[a].push_back(b);
inDegree[b]++;
}
tuopuSort();
}
return 0;
}
内容总结
以上是互联网集市为您收集整理的算法笔记-问题 B: 确定比赛名次全部内容,希望文章能够帮你解决算法笔记-问题 B: 确定比赛名次所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。