hdu_1285_拓扑排序入门_数组模拟_队列优化
2017-08-28 18:21
323 查看
确定比赛名次
有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
Source
杭电ACM集训队训练赛(VII)
拓扑排序解决问题 :
在有向无环图中,求解活动发展的先后顺序,无环就是图中没有回路;
实现原理:
记录每点的入度,找到入度为0的点输出,然后删除和该点有关的边
数组
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { int n,m,i,j; while(cin>>n>>m) { int mp[555][555]={0},in_degree[555]={0},ans[555]={0}; for(i=0;i<m;i++) { int a,b; scanf("%d%d",&a,&b); mp[a][b]=1; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(mp[i][j]) in_degree[j]++; for(i=1;i<=n;i++) { int k=1; while(in_degree[k]!=0) k++; ans[i]=k; in_degree[k]=-1; for(j=1;j<=n;j++) if(mp[k][j]) in_degree[j]--; } for(i=1;i<=n;i++) printf("%d%c",ans[i],i==n ? '\n':' '); } return 0; }
队列
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> using namespace std; priority_queue< int,vector<int>,greater<int> > q; int main() { int n,m,i,j; while(cin>>n>>m) { int mp[555][555]= {0},in_degree[555]= {0},ans[555]= {0}; for(i=0; i<m; i++) { int a,b; scanf("%d%d",&a,&b); mp[a][b]=1; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(mp[i][j]) in_degree[j]++; for(i=1; i<=n; i++) if(!in_degree[i]) q.push(i); int k=1; while(!q.empty()) { int v=q.top(); q.pop(); if(k!=n) { cout<<v<<" "; k++; } else cout<<v<<endl; for(i=1; i<=n; i++) { if(!mp[v][i]) continue; in_degree[i]--; if(!in_degree[i]) q.push(i); } } } return 0; }
相关文章推荐
- HDU 1285 确定比赛名次【拓扑排序入门题,链式前向星建图】
- HDU 1285——确定比赛名次(拓扑排序入门)
- hdu 1285 拓扑排序 入门
- 股票交易 【SCOI 2010】HDU 3401 (单调队列优化DP入门)
- 确定比赛名次(hdu-1285)(拓扑排序队列实现)
- HDU 1285 确定比赛名次 【入门拓扑排序】
- hdu_2795_线段树入门_线段树由树状数组转坑原本数组模拟
- HDU 5102 The K-th Distance(队列模拟,数组模拟邻接表)
- HDU 1285 确定比赛名次(拓扑排序&amp;&amp;优先队列优化)
- hdu 1285 拓扑排序入门题
- HDU 6215 模拟链表 + 队列优化
- hdu 1285 确定比赛名次 拓扑排序模板题 优先队列
- hdu 1237 简单计算器(数组模拟栈,队列)
- 拓扑排序模板-优先队列 hdu 1285 确定比赛名次
- HDU-1285 拓扑排序(入门)
- HDU 2993 MAX Average Problem(斜率优化入门+单调队列)
- 【HDU】-1285-确定比赛名次(拓扑排序)(二维数组||邻接表||队列)
- 2015 Multi-University Training Contest 10 (hdu 5406-5416)数据结构+dp+矩阵快速幂+bitset优化拓扑排序+(dp&树状数组)
- HDU 3507 PrintArticle (单调队列优化)
- HDU 1285 确定比赛名次 (预处理+拓扑排序)