拓扑排序
来源:互联网 发布:华南理工大学绩点算法 编辑:程序博客网 时间:2024/06/13 11:00
有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
做法:用优先队列的拓扑排序
#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>#include <queue>#define maxn 520using namespace std;int g[maxn][maxn];int n,m;int in[maxn];int out[maxn];struct Node{ int in; int out; int priority; int id; friend bool operator < (Node a,Node b) { return a.id>b.id; };}node[maxn];void init(){ memset(g,0,sizeof(g)); memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); for(int i=0;i<=n;i++) { node[i].id=i; }}void solve(){ int cnt=0; priority_queue<Node> q; for(int i=1;i<=n;i++) { if(in[i]==0) { q.push(node[i]); } } while(!q.empty()) { int cur=q.top().id; cnt++; if(cnt!=n)printf("%d ",cur); else printf("%d",cur); q.pop(); for(int i=1;i<=n;i++) { if(g[cur][i]) { g[cur][i]=0; in[i]--; if(in[i]==0) { q.push(node[i]); } } } }}int main(){ int a,b; while(scanf("%d%d",&n,&m)==2) { init(); for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); if(!g[a][b]) { g[a][b]=1; in[b]++; } } solve(); printf("\n"); } return 0;}
阅读全文
0 0
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 【拓扑排序】
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- <th>和<td>标签都是用于表格单元格显示的。
- Java学习篇5-面向对象
- 7-17常用类上
- canvas实现图像截图展示
- Android NDK: From Elementary to Expert Episode 19
- 拓扑排序
- StopWatch 监控Java代码运行时间和分析性能
- 正确答案
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(三)NOIP2002-NOIP2003
- 数据结构——绪论
- 17.7.17
- jni问题总结:jni error (app bug): accessed stale local reference
- centos 7 发送邮件
- Java正则