确定比赛名次

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
杭电ACM集训队训练赛(VII)

我对拓扑排序的理解:根据自定义值的大小排序(大数的不一定大,小数不一定小)。自定义谁在前谁在后。

解题思路:

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

对一个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;}elsecout<<" "<<cur;for(int i=1;i<=n;i++){if(graph[cur][i]){degree[i]--;//相连的点的入度减1if(degree[i]==0)//如果入度为0,加入队列q.push(i);}}}printf("\n");}return 0;
}

转载于:https://www.cnblogs.com/yzm10/p/7229672.html

[ACM] hdu 1285 确定比赛名次 (拓扑排序)相关推荐

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

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

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

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

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

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

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

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

  5. hdu 1285 确定比赛名次

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

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

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

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

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

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

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

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

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

最新文章

  1. 测试字符串读取类: TStringReader
  2. ​rsync应用拓展多模块同步13
  3. springBoot后台发送内容至邮箱
  4. 网线制作(一根网线劈开给2台同时上网使用)
  5. Linux AV1硬件视频解码将支持Intel Tiger Lake
  6. 数据湖,大数据的下一个变革!
  7. 如何解决python中编码错误的问题_【总结】Python 2.x中常见字符编码和解码方面的错误及其解决办法...
  8. oracle存储返回sql查询,如何做才能使record类型和table类型存储查询语句返回的多条记录?...
  9. 【opencv学习】完全基于opencv的双目景深与测距的实现
  10. go 框架iris 响应记录器
  11. 机器学习,总是不得其法,问题出在哪里?
  12. 【智能优化算法】基于粒子群求解光伏电池MPPT工程数学模型附matlab代码
  13. 苍井空老师推特唤醒中国网民正版意识
  14. 读书笔记之怎样在股市获得稳健收益
  15. 如何理解软件测试质量,我对测试总结报告和质量分析报告的理解
  16. 沉船会有什么_泰坦尼克号为何会沉没,百年来又为何一直没有打捞?专家一声叹息...
  17. Gym 100015B Ball Painting
  18. Qt 5.12.10 用Design ui 设计界面,连续输入中文时,变成英文输入
  19. EF 通用帮助类 含分页 Lambda 拼接表达式
  20. 【DM】教你用JDBC连接达梦数据库并进行增删改查

热门文章

  1. Android ART GC之GrowForUtilization的分析
  2. 双代号网络图基础算法_9个简单数学算法在管理领域的运用
  3. JZOJ 5637. 【NOI2018模拟4.8】一双木棋
  4. java基础知识大全,java 基础知识点汇总
  5. java获取系统属性_Java获取系统属性
  6. Ubuntu16.04安装ROS kinetic
  7. Qt 并行计算 Concurrent Run的翻译
  8. python的api库_python 利用toapi库自动生成api
  9. python语音命名规则_python语音变量命名规则
  10. TextVQA论文汇总