[ACM] hdu 1285 确定比赛名次 (拓扑排序)
确定比赛名次
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10358 Accepted Submission(s): 4046
其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
我对拓扑排序的理解:根据自定义值的大小排序(大数的不一定大,小数不一定小)。自定义谁在前谁在后。
解题思路:
原理:拓扑排序是应用于有向无回路图(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 确定比赛名次 (拓扑排序)相关推荐
- [ACM] hdu 1285 确定比赛 (拓扑排序)
确定比赛 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1285 确定比赛名次 拓扑排序(邻接矩阵 邻接表
确定比赛名次 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description ...
- HDU 1285 - 确定比赛名次(拓扑排序)
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- HDU-1285 确定比赛名次 拓扑排序
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- hdu 1285 确定比赛名次
//拓扑排序裸题,题目要求按编号从小到大输出,要换一种思维去思考 //按照数据结构课本的算法,建立邻接表,用栈实现.初始化先将入度为0的顶点入栈,然后以栈顶顶点为准,先将栈顶顶点出栈输出它的信息,然后 ...
- HDU - 128 确定比赛名次(基于有向无环图(GAD)的排序--拓扑排序)
题目链接:https://vjudge.net/contest/325616#problem/A 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N,进行比赛,比赛结束 ...
- HDU 1285--确定比赛名次【拓扑排序 amp;amp; 邻接表实现】
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 拓扑排序杭电 1285确定比赛名次
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- hdoj 1285 确定比赛名次 【拓扑排序】
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
最新文章
- 测试字符串读取类: TStringReader
- ​rsync应用拓展多模块同步13
- springBoot后台发送内容至邮箱
- 网线制作(一根网线劈开给2台同时上网使用)
- Linux AV1硬件视频解码将支持Intel Tiger Lake
- 数据湖,大数据的下一个变革!
- 如何解决python中编码错误的问题_【总结】Python 2.x中常见字符编码和解码方面的错误及其解决办法...
- oracle存储返回sql查询,如何做才能使record类型和table类型存储查询语句返回的多条记录?...
- 【opencv学习】完全基于opencv的双目景深与测距的实现
- go 框架iris 响应记录器
- 机器学习,总是不得其法,问题出在哪里?
- 【智能优化算法】基于粒子群求解光伏电池MPPT工程数学模型附matlab代码
- 苍井空老师推特唤醒中国网民正版意识
- 读书笔记之怎样在股市获得稳健收益
- 如何理解软件测试质量,我对测试总结报告和质量分析报告的理解
- 沉船会有什么_泰坦尼克号为何会沉没,百年来又为何一直没有打捞?专家一声叹息...
- Gym 100015B Ball Painting
- Qt 5.12.10 用Design ui 设计界面,连续输入中文时,变成英文输入
- EF 通用帮助类 含分页 Lambda 拼接表达式
- 【DM】教你用JDBC连接达梦数据库并进行增删改查
热门文章
- Android ART GC之GrowForUtilization的分析
- 双代号网络图基础算法_9个简单数学算法在管理领域的运用
- JZOJ 5637. 【NOI2018模拟4.8】一双木棋
- java基础知识大全,java 基础知识点汇总
- java获取系统属性_Java获取系统属性
- Ubuntu16.04安装ROS kinetic
- Qt 并行计算 Concurrent Run的翻译
- python的api库_python 利用toapi库自动生成api
- python语音命名规则_python语音变量命名规则
- TextVQA论文汇总