确定比赛名次

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

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


拓扑排序:在由一个有向无环图的顶点组成的序列中,当满足:
1、每个顶点出现且只出现一次;
2、若A在序列中排在B的前面,则在图中不存在从B到A的路径。那么就称该序列是该图的一个拓扑排序。
解题思路:当p1战胜p2的时候那么p2的前驱就是p1,p2前驱的数量就增加1。用一个数组indegree[](初始化为0)来存储每个点的前驱数量;前驱为0的自然就是第一名。找到第一名后输出,然后再把第一名删除掉,其余前驱相应减一,这时第二名就变成了第一名,以此类推。。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int map[505][505];//判断两支队伍是否进行了比赛
int n,indegree[505];//记录该队伍的前驱个数
int queue[505];//记录所有队伍的排名
void tuopu(){int top;//暂存当前第一名 int k=0;//用来记录名次 for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(indegree[j]==0){top=j;//入度(前驱)为0的点即第一名 break;}}queue[k++]=top;//保存当前第一名后,下一个“第一”就是K+1 indegree[top]=-1;//第一名入保存后,删除for(int j=1;j<=n;j++){if(map[top][j])indegree[j]--;//每一项的入度都相应-1 }}for(int i=0;i<n-1;i++)printf("%d ",queue[i]);printf("%d\n",queue[n-1]);//输出格式
}
int main(){int a,b,m;while(~scanf("%d%d",&n,&m)){memset(indegree,0,sizeof(indegree));memset(map,0,sizeof(map));for(int i=0;i<m;i++){scanf("%d%d",&a,&b);if(map[a][b]==0){//这个判断是为了防止数据中有重复! map[a][b]=1;//记录对战的队伍 indegree[b]++;//战败队伍的入度+1 }}tuopu();}return 0;
}

HDOJ -- 1285 确定比赛名次相关推荐

  1. hdoj 1285 确定比赛名次 【拓扑排序】

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  2. HDOJ 1285 确定比赛名次(拓扑排序)

    2018-5-23 简单的拓扑排序,我用的是优先队列,按照字典序排序,将入度为零的点放入队列, 则直接按照字典序排序. 需要注意的是:如果有两个重复的数据,则相应的入度值就不应该加一了. #inclu ...

  3. HDU 1285 确定比赛名次 拓扑排序(邻接矩阵 邻接表

    确定比赛名次 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description ...

  4. HDU 1285 - 确定比赛名次(拓扑排序)

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  5. 拓扑排序杭电 1285确定比赛名次

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  6. [ACM] hdu 1285 确定比赛名次 (拓扑排序)

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  7. 杭电1285确定比赛名次

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  8. hdu 1285 确定比赛名次

    //拓扑排序裸题,题目要求按编号从小到大输出,要换一种思维去思考 //按照数据结构课本的算法,建立邻接表,用栈实现.初始化先将入度为0的顶点入栈,然后以栈顶顶点为准,先将栈顶顶点出栈输出它的信息,然后 ...

  9. HDU 1285:确定比赛名次(拓扑排序)

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

最新文章

  1. 185页深度报告 扒一扒AI金融的老底【附下载】
  2. 学习Python3:201701030
  3. 搭建基于Docker社区版的Kubernetes本地集群
  4. Spring Integration完整示例
  5. linux apache中文名称图片,Apache、NGINX支持中文URL图片、文件名的终极解决方案
  6. 【Python CheckiO 题解】First Word
  7. 影响mysql导入效率的参数_extended-insert对mysqldump及导入性能的影响
  8. 【云笔记搭建】Visual Code + Github仓库 + Git
  9. Vulkan Nvidia 驱动 VK_ERROR_LAYER_NOT_PRESENT
  10. C语言12之什么是字符串类型?
  11. 讲解VR全景拍摄相机光圈、感光度和快门的作用
  12. A/B Test 使用指南
  13. 新松机器人袁_中科新松许小刚:智能协作机器人是中国机器人产业发展新节点...
  14. 接口测试方法论——WebSocket一点通
  15. 线上支付对接(支付宝篇)
  16. 检查两个时间段是否有时间重叠(允许重叠一部分时间不算重叠)
  17. 深度学习数学基础之激活函数与导数
  18. 计算几何-Ang-Rad-Vector
  19. CHIL-SQL-SELECT INTO 语句
  20. Linux内核MTD子系统七之Flash 存储器接口标准:CFI和JEDEC

热门文章

  1. navicate导出数据库结构为PDF文档格式
  2. 步进驱动器基础及工作原理
  3. A. Find The Array
  4. 美云智数移动平台互联技术,为传统企业打开了转型的切口
  5. oracle+m10-5,pchm10是oppo什么型号
  6. css 科技 边框_CSS3 边框
  7. VUE调用高德地图之电子围栏
  8. 联想m920t装红旗linux中SPik,联想M920t台式机win10怎么改win7系统(完美支持usb驱动)
  9. 微信开发-基于Ngrok的内网穿透工具-netapp
  10. 安卓系统的发展历程?