确定比赛

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 10358    Accepted Submission(s): 4046

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 3
1 2
2 3
4 3
 
Sample Output
1 2 4 3
 
Author
SmallBeer(CML)
 
Source

解题思路:

原理:拓扑排序是应用于有向无回路图(DAG)上的一种排序方式。对一个有向无回路进行拓扑排序后,全部的顶点形成一个序列,对全部边(u,v),满足u在v的前面。该序列说明了顶点表示的事件或 状态发生的总体顺序。比較经典的是在project活动上,某些project完毕后。还有一些project才干继续,此时能够以project为顶点,project间的依赖关系为边建立图。用拓扑排序来求得全部project的合理运行顺序。

对一个DAG进行拓扑排序有两种方法,广度优先搜索和深度优先搜索。

这里介绍广度优先搜索。进行拓扑排序时,每次能够拿出的顶点一定是入度为0的点,即没有被指向的点,由于这种点表示的事件没有依赖。在一个入度为0的点表示的事件运行完之后。它所指向的顶点所依赖的点就少了一个。所以我们能够先将全部入度为0的点增加一个队列中。然后依次将它们所指向的点的入度减1,再将入度变为0的点也依次增加队列中。这样最后就能够得到一个拓扑有序的序列。

本题中说符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前。须要用到优先队列,每次从队列中取的是最小的那个元素。

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
const int maxn=510;
int graph[maxn][maxn];//保存图
int degree[maxn];//保存入度 int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(graph,0,sizeof(graph));
memset(degree,0,sizeof(degree));
for(int i=0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
if(!graph[u][v])
{
graph[u][v]=1;
degree[v]++;//v的入度++
}
}
priority_queue<int,vector<int>,greater<int> >q;
for(int i=1;i<=n;i++)
if(degree[i]==0)
q.push(i);
bool first=1;
while(!q.empty())
{
int cur=q.top();
q.pop();
if(first)
{
cout<<cur;
first=0;
}
else
cout<<" "<<cur;
for(int i=1;i<=n;i++)
{
if(graph[cur][i])
{
degree[i]--;//相连的点的入度减1
if(degree[i]==0)//假设入度为0,增加队列
q.push(i);
}
}
}
printf("\n");
}
return 0;
}

版权声明:本文博主原创文章。博客,未经同意不得转载。

最新文章

  1. CSS垂直水平居中方法总结
  2. linux开启ssh服务
  3. BZOJ_1621_[Usaco2008_Open]_Roads_Around_The_Farm_分岔路口(模拟+大水题)
  4. 转:如何在Linux上提高文本的搜索效率
  5. leetcode Permutation
  6. Ubuntu-升级linux软件源,安装vim/五笔
  7. WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理
  8. android视频库Vitamio
  9. codeforces 665A Buses Between Cities
  10. Angular2开发拙见
  11. 基于容器微服务的PaaS云平台设计(二)通过kubernetes实现微服务容器管理
  12. UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)
  13. C++STL模板库适配器之stack容器
  14. 【备忘】mybatis的条件判断用&lt;choose&gt;
  15. 【Codeforces 848C】Goodbye Souvenir
  16. C宏替换优先级
  17. gitlab覆盖率
  18. xshell实时跟踪日志与中文乱码设置
  19. BLE低功耗蓝牙关键技术解析与应用
  20. 【转载】C/C++杂记:虚函数的实现的基本原理

热门文章

  1. Oracle如何插入在特殊字符: &amp;amp; 和 &amp;#39; (各种解决方案)
  2. 微软中国裁员曝光:在CD结束后!薪酬不变!
  3. Android Java 与 C++ 恒调用,路径、文件名、延长的最大长度
  4. [LeetCode92]Reverse Linked List II
  5. 有人实践过 Phabricator 以及 Arcanist 作为 code review 的工具么?(转)
  6. 黑马程序员—创建JDBC框架及原理分析
  7. HSQLDB相关信息及用法汇总
  8. C# 读取IE缓存文件(1)
  9. 大约session_cached_cursors在不同的db在默认不同的版本号
  10. ExtJs--02--MessageBox相关弹出窗口alert,prompt,confirm采用