九度 题目1449:确定比赛名次
来源:互联网 发布:centos更新命令 编辑:程序博客网 时间:2024/05/31 06:22
九度 题目1449:确定比赛名次
原题OJ链接:http://ac.jobdu.com/problem.php?pid=1449
题目描述:
有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队。
输出:
给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。
其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
样例输入:
4 31 22 34 3
样例输出:
1 2 4 3
解题思路:
输出拓扑排序,但要注意一点——符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前。这里采用优先级队列中的小顶堆,则可以满足题意。
源代码:
#include<iostream>#include<vector>#include<queue>using namespace std;vector<int> edge[501];priority_queue<int, vector<int>, greater<int> > Q;//小顶堆int main(){ int n,m; int inDegree[501]; while(cin>>n>>m){ int p1,p2; for(int i=1;i<=n;i++){ inDegree[i]=0; edge[i].clear(); } for(int i=0;i<m;i++){ cin>>p1>>p2; inDegree[p2]++; edge[p1].push_back(p2); } while(Q.empty()==false) Q.pop(); for(int i=1;i<=n;i++){ if(inDegree[i]==0) Q.push(i); } int cnt=0; while(Q.empty()==false){ int nowP=Q.top();//输出堆顶元素 Q.pop(); cnt++;//被确定的结点个数加一 for(int i=0;i<edge[nowP].size();i++){ inDegree[edge[nowP][i]]--; if(inDegree[edge[nowP][i]]==0){ Q.push(edge[nowP][i]); } } if(cnt<n) cout<<nowP<<" "; else if(cnt==n) cout<<nowP<<endl; } } return 0;}
阅读全文
0 0
- 九度题目1449:确定比赛名次
- 九度题目1449:确定比赛名次
- 九度 题目1449:确定比赛名次
- 九度 题目1449:确定比赛名次
- 九度 题目1449:确定比赛名次
- 九度oj 题目1449:确定比赛名次
- 九度OJ 1449 确定比赛名次
- 九度 OJ 1449 确定比赛名次
- 九度OJ-1449:确定比赛名次
- 题目1449:确定比赛名次
- 题目1449:确定比赛名次
- 题目1449:确定比赛名次
- 九度1449:确定比赛名次(拓扑排序)
- Jobdu 题目1449:确定比赛名次
- 题目81:确定比赛名次
- 确定比赛名次
- 确定比赛名次
- 确定比赛名次
- Android开发 JDK和SDK简单配置
- 彻底卸载删除mysql及注册表
- 质因子分解
- 中山大学算法课程题目详解(第二周)
- 笔记本安装CentOS7过程以及双系统引导方法
- 九度 题目1449:确定比赛名次
- PX4飞控学习(一)
- eclipse中serverRuntime Environment无法添加tomcat
- 系统进程
- 程序人生之自我介绍
- searchbar隐藏navigationbar问题解决
- java中的四种引用
- C语言学习—给学习C语言初学者的建议
- 如何使用RedisTemplate访问Redis数据结构