确定比赛名次

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 34040    Accepted Submission(s): 13351

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 31 22 34 3
Sample Output
1 2 4 3

思路:把给出的每组数据a,b按照<a,b>组成一个有向无环图,对这个图的顶点进行拓扑排序。

将样例改成有向无环图

然后找到入度为0的点:1,4 。因为要编号小的队伍在前,所以先删去点1和与1相关的边,并输出点1

删去后如图:

就这样一直按递增顺序删去入度为0的点并输出,直至最后无相连的点。

最后可得到按顺序输出的点1-->2-->4-->3

详解传送门

AC代码

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#define ll long long
#define INF 0x3f3f3f3f
const int maxn=1e3+10;
int p[maxn][maxn],vis[maxn];//p记录两点是否相连,vis记录点的入度
int n,m;
void toposort()
{for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(!vis[j])//如果入度为0(没有前驱点){vis[j]--;//入度变成-1进行标记(入度为-1的点均为已经删除的点)printf("%d",j);//输出该节点if(i!=n)printf(" ");elseprintf("\n");for(int k=1;k<=n;k++){if(p[j][k])vis[k]--;//将与j相连的节点都删去(删除与j有关的边)}break;}}}
}
int main(int argc, char const *argv[])
{int x,y;while(~scanf("%d%d",&n,&m))//不要忘了是多组输入{memset(p,0,sizeof(p));memset(vis,0,sizeof(vis));for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);//对数据进行处理,如果两点相连,p[x][y]=1,y的入度增加1if(!p[x][y]){p[x][y]=1;vis[y]++;}}toposort();}return 0;
}

转载于:https://www.cnblogs.com/Friends-A/p/9308990.html

HDU 1285:确定比赛名次(拓扑排序)相关推荐

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

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

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

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

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

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

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

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

  5. HDU-1285 确定比赛名次 拓扑排序

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

  6. hdu 1285 确定比赛名次

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

  7. HDU - 128 确定比赛名次(基于有向无环图(GAD)的排序--拓扑排序)

    题目链接:https://vjudge.net/contest/325616#problem/A 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N,进行比赛,比赛结束 ...

  8. HDU 1285--确定比赛名次【拓扑排序 amp;amp; 邻接表实现】

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

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

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

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

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

最新文章

  1. Node.js-提供了四种形式的定时器
  2. web前端学习day_05:Bootstrap
  3. mosn 中的context、变量 和 内存复用机制
  4. c 语言中三个函数,帮忙解释几个C语言中的函数?
  5. IIS7 经典模式和集成模式的区别分析
  6. SecureCRT文件传输
  7. spring webscoket服务端使用记录
  8. textarea输入中文和数字换行解决方法
  9. Javascript中对空string调用split返回不是空数组
  10. Github使用: 本地上传, 与之同步
  11. 掌握用 STL 中的 SET 动态维护 “各类型凸壳” / “凸包”
  12. 凯利KAC交流控制器调试方案
  13. 外贸人写开发信会犯的错误,你中了哪几个
  14. Spark大数据分与实践笔记(第二章 Spark基础-03)
  15. python签到脚本_基于Python实现签到脚本过程解析
  16. miui android系统 流量,小米4 MIUI6系统怎么设置流量功能?小米4 MIUI6流量管理设置?...
  17. PHP 多行文字内容的重复检测功能并统计重复次数
  18. 微服务项目之电商--15.后台分页查询及新增品牌业务添加
  19. 电脑故障一查通 软件教学
  20. sklearn.metrics 用法详解

热门文章

  1. db2 导出换行_数据库 db2 换行符
  2. NodeJs数据库CRUD操作
  3. 年薪50万的程序员_985程序员年薪50万,看似风光,但当事人却想转行
  4. 德媒:外景代替了现实 中国人拍婚纱照跑到很远地方
  5. rpm常用命令集合2
  6. 网络配置辅导:多路由器如何使用多条ADSL线路
  7. Visual Basic编程常见问题及解答(3)
  8. 英语总结系列(二十一):英语也能玩出新花样
  9. 机房收费系统合作版(三):利用备忘录模式实现取消修改基本数据
  10. 3D版pix2pix来了,画一只猫就能抱起来吸丨github