题目链接

糟糕的事情发生啦,现在大家都忙着逃命。但是逃命的通道很窄,大家只能排成一行。现在有n个人,从1标号到n。同时有一些奇怪的约束条件,每个都形如:a必须在b之前。同时,社会是不平等的,这些人有的穷有的富。1号最富,2号第二富,以此类推。有钱人就贿赂负责人,所以他们有一些好处。负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,如果此时还有多种情况,就再让2号尽量靠前,如果还有多种情况,就让3号尽量靠前,以此类推。
那么你就要安排大家的顺序。我们保证一定有解

Input
第一行一个整数T(1 <= T <= 5),表示测试数据的个数然后对于每个测试数据,第一行有两个整数n(1 <= n <= 30000)和m(1 <= m <= 100000),分别表示人数和约束的个数。然后m行,每行两个整数a和b,表示有一个约束a号必须在b号之前。a和b必然不同

Output
对每个测试数据,输出一行排队的顺序,用空格隔开

  1. 题目大意:n个人排成一队,除了必要的约束条件:输入a b代表a必须排在b的前面。满足m个约束条件后,还有一个对所有点来说的关系就是1号最富,2号第二富,以此类推。所以要让1号尽量靠前,如果此时还有多种情况,就再让2号尽量靠前,如果还有多种情况,就让3号尽量靠前,以此类推。输出该序列
  2. 明显是拓扑排序的裸题,如果用最小堆的优先队列,跑一遍拓扑排序便过了样例。刚开始没注意m很大,使用了cin导致TLE了一发。但改过输入后竟然还是WA,十分不解,再次检查代码,没有发现问题
  3. 无奈之下去请教别人做法,大部分博客都写的很水,只说一遍反向建图再拓扑排序求得逆序,将答案反向输出。这谁看的懂?
  4. 看了好多,终于知道为什么错了,下面我来详细分析:

思路:

假如我们这样输入:
7 3
3 1
1 6
2 5
5 4
4 6
那么按正常的拓扑排序我们得到的是如下这样的图,"→"代表出边

首先之所以排除我第一次想到的用最小堆的优先队(priority_queue<int,vector,greater >),是因为理解错了题目意思,题目要求的并不是编号小的尽量在前,而是1具有最大优先级,然后是2,3…因此如果满足了所有前后关系,那么先满足1号在前,接着是满足2号再前,以此类推。按上述例子得到的是2 5 4 7 3 1 6。正确答案应该是1在2的前面

没办法我们就去找办法,先看正常的拓扑排序。无论我们从入度为0的7开始排序,还是从入度为0的2开始排序,得到答案明显都是错的。那我们试着反向建图,"←"代表出边

我们如果使用一般队列,得到的仍然不是正确答案,但是如果我们使用了最大堆的优先队列,那么得到的是6 4 5 2 1 3 7。反过来7 3 1 2 5 4 6刚好就是正确答案了。

对比一下,正向建图使用最小堆,那么我们只是考虑的当前入队的所有的最小出队,因此无法保证后面的较小编号排在前面。但是如果我们反向建图并考虑当前队列最大编号出队,恰恰满足了编号最小的排到了后面,因此也就达到了我们的目的

代码:

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;const int N=3e4+10;
priority_queue<int,vector<int>> q;
vector<int> G[N],ans;
int in[N];
int n,m,x,y,T;void topsort(){for(int i=1;i<=n;i++)if(!in[i]) q.push(i);while(!q.empty()){int temp=q.top();q.pop();ans.push_back(temp);for(int i=0;i<G[temp].size();i++){int p=G[temp][i];in[p]--;if(in[p]==0)q.push(p);}}
}int main()
{scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);memset(in,0,sizeof(in));while(m--){scanf("%d%d",&x,&y);G[y].push_back(x); //出边入队in[x]++;}topsort();for (int i=ans.size()-1;i>=0;i--)printf("%d%c",ans[i],i==0?'\n':' ');ans.clear();for(int i=1;i<=n;i++){G[i].clear();}}return 0;
}

HDU4857 逃生(拓扑排序经典好题)相关推荐

  1. hdu-----(4857)逃生(拓扑排序)

    逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  2. HDU 4857 逃生 拓扑排序好题 第一次做CLJ出的题

    逃生 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b ...

  3. hdu 4857 逃生 拓扑排序

    逃生 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4857 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只 ...

  4. 算法提高课-图论-单源最短路的综合应用-AcWing 342. 道路与航线:最短路dijkstra、拓扑排序 、综合题、好题

    题目分析 来源:acwing 分析: 道路:双向,边权非负, 航线:单向,边权可正可负,且无环. 根据题意,点可以分为很多团(连通块),团内部只有道路(道路是双向的,而且是连通的,所以不能存在航线,否 ...

  5. HDU4857 逃生【拓扑排序】

    逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  6. 搜索与图论1—深搜、宽搜、拓扑排序

    本人的LeetCode账号:魔术师的徒弟,欢迎关注获取每日一题题解,快来一起刷题呀~ 本人Gitee账号:路由器,欢迎关注获取博客内容源码. 文章目录 一.深度优先搜索 1 排列数字 2 N皇后 二. ...

  7. ACM: hihicoder #1174 : 拓扑排序·一 STL- queue

    #1174 : 拓扑排序·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 由于今天上课的老师讲的特别无聊,小Hi和小Ho偷偷地聊了起来. 小Ho:小Hi,你这学期有选 ...

  8. POJ 2367 Genealogical tree【拓扑排序】

    题意:大概意思是--有一个家族聚集在一起,现在由家族里面的人讲话,辈分高的人先讲话.现在给出n,然后再给出n行数 第i行输入的数表示的意思是第i行的子孙是哪些数,然后这些数排在i的后面. 比如样例 5 ...

  9. Bailian4084 拓扑排序【拓扑排序】

    4084:拓扑排序 总时间限制: 1000ms 内存限制: 65536kB 描述 给出一个图的结构,输出其拓扑排序序列,要求在同等条件下,编号小的顶点在前. 输入 若干行整数,第一行有2个数,分别为顶 ...

最新文章

  1. IDEA代码格式化快捷键(新)
  2. C#中调用API函数RegisterHotKey注册多个系统热键
  3. 【资讯】CloudBase Framework工具推荐:前后端一体化部署,效能提升开源“神器”
  4. CFile读写文件 实现复制文件功能
  5. tcpdump抓取udp报文
  6. 一步步通过命令行cl.exe编译Windows程序
  7. java循环一年月份天数和_javawhile循环编写输入某年某月某日,判断这一天是这一年的第几…...
  8. flutter版本的玩Android客户端
  9. STM8单片机读取18B20温度传感器
  10. 乔治亚理工学院计算机专业,乔治亚理工学院
  11. jdbc-日期格式的转换及代码示例
  12. .net程序员转战android第二篇---牛刀小试
  13. 我是一只 IT小小鸟
  14. rgba 透明度转换十六进制
  15. 有人还原出了历史上的皇帝,朱元璋居然还挺帅?
  16. xp系统怎么更改计算机用户名和密码,如何解决用户不能更改WindowsXP系统密码
  17. 老米之家域名投资是什么?域名怎么购买?域名的购买方式?
  18. 将文件夹的分组方式应用到电脑的所有文件夹
  19. 在 Ubuntu 中安装 DOSBox 玩老游戏
  20. 鸿蒙轻内核源码分析:文件系统LittleFS

热门文章

  1. windows net use 把共享目录映射为本地磁盘
  2. fileInputformat切片总结
  3. FileInputFormat切片源码解析
  4. 写代码必备神器!腕上潮流敲代码贼爽!
  5. zookeeper权限控制详解
  6. vue 路由跳转报错 redirected when going from via a navigation guard
  7. 游承超:手机钢化玻璃膜平边与弧边的区别(1P)
  8. xp sp2 IIS5.1 错误服务器应用程序不可用
  9. NOI 3343 NOI3344热血和冷血格斗场
  10. 《Python 深度学习》-弗朗索瓦 肖莱-(一)双系统ubuntu及TensorFlow系统安装