Problem Description

糟糕的事情发生啦,现在大家都忙着逃命。但是逃命的通道很窄,大家只能排成一行。

现在有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

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

Sample Input

  1.  

Sample Output

这是一种比较坑的排序,要求编号小的尽量排在前面,这里平时的是不一样的。

例子来自:https://blog.csdn.net/qq_41713256/article/details/80805338

如果你用优先队列拓扑排序得到的是:3 5 6 4 1 7 8 9 2 0

但是正确答案为 6 4 1 3 9 2 5 7 8 0 这样使得小的(1)尽量在前面。

这题相当于逆向的拓扑排序,因为小的要尽量放前面。

如果正向拓扑的话,优先队列要设置成小的值优先,这样万一出现一个比较小的入度为0的点,就会直接放进queue去 ,这样万一后面还有更小的点的话就出错了。

所以要逆向拓扑,从右往左想,所有特殊条件都没有指明谁要在它后面的点先放(即这个点的出度为0),优先队列设置成大的优先。

思路:逆向拓扑 + 优先队列

1.反向建边,点大的优先级高。
2.用拓扑排序+优先队列,逆向输出序列即可。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <iostream>
  4. #include <string>
  5. #include <math.h>
  6. #include <algorithm>
  7. #include <vector>
  8. #include <stack>
  9. #include <queue>
  10. #include <set>
  11. #include <map>
  12. #include <sstream>
  13. const int INF=0x3f3f3f3f;
  14. typedef long long LL;
  15. const double eps =1e-;
  16. const int mod=1e9+;
  17. const int maxn=1e5+;
  18. using namespace std;
  19.  
  20. struct edge
  21. {
  22. int to;
  23. int next;
  24. }E[maxn];
  25. int head[maxn];
  26. int tot;
  27. void add(int u,int v)
  28. {
  29. E[tot].to=v;
  30. E[tot].next=head[u];
  31. head[u]=tot++;
  32. }
  33.  
  34. priority_queue<int> qe;
  35. vector<int> ans;
  36. int in[maxn];
  37.  
  38. void init()
  39. {
  40. tot=;
  41. memset(in,,sizeof(in));
  42. memset(head,-,sizeof(head));
  43. while(!qe.empty()) qe.pop();
  44. ans.clear();
  45. }
  46.  
  47. int main()
  48. {
  49. #ifdef DEBUG
  50. freopen("sample.txt","r",stdin);
  51. #endif
  52.  
  53. int T;
  54. scanf("%d",&T);
  55. while(T--)
  56. {
  57. int n,m;
  58. scanf("%d %d",&n,&m);
  59. init();
  60. for(int i=;i<=m;i++)
  61. {
  62. int u,v;
  63. scanf("%d %d",&u,&v);
  64. add(v,u);
  65. in[u]++;
  66. }
  67. for(int i=;i<=n;i++)
  68. if(in[i]==) qe.push(i);
  69. while(!qe.empty())
  70. {
  71. int u=qe.top(); qe.pop();
  72. ans.push_back(u);
  73. for(int i=head[u];i!=-;i=E[i].next)
  74. {
  75. int v=E[i].to;
  76. in[v]--;
  77. if(in[v]==) qe.push(v);
  78. }
  79. }
  80. for(int i=ans.size()-;i>=;i--)
  81. printf(i==?"%d\n":"%d ",ans[i]);
  82. }
  83.  
  84. return ;
  85. }

-

HDU-4857 逃生(逆向拓扑排序)的更多相关文章

  1. HDU 4857 逃生 【拓扑排序+反向建图+优先队列】

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

  2. HDU 4857 逃生(拓扑排序)

    拓扑排序 一.定义 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈ ...

  3. (hdu) 4857 逃生 (拓扑排序+优先队列)

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

  4. hdu 4857 逃生 (拓扑排序+保证最小在前面)

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

  5. HDU 4857 (反向拓扑排序 + 优先队列)

    题意:有N个人,M个优先级a,b表示a优先于b.而且每一个人有个编号的优先级.输出顺序. 思路来自:与PKU3687一样 在主要的拓扑排序的基础上又添加了一个要求:编号最小的节点要尽量排在前面:在满足 ...

  6. 题解报告:hdu 2647 Reward(拓扑排序)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 Problem Description Dandelion's uncle is a boss ...

  7. HDU 4857 逃生 (反向拓扑排序 & 容器实现)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  8. hdu 4857 逃生 拓扑排序+PQ,剥层分析

    pid=4857">hdu4857 逃生 题目是求拓扑排序,但不是依照字典序最小输出,而是要使较小的数排在最前面. 一開始的错误思路:给每一个点确定一个优先级(该点所能到达的最小的点) ...

  9. 正向与反向拓扑排序的区别(hdu 1285 确定比赛名次和hdu 4857 逃生)

    确定比赛名次 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  10. HDU 4857 逃生(反向建边的拓扑排序+贪心思想)

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

随机推荐

  1. 让Nutz支持最快的模板引擎Smarty4j

    Smarty4j是一个开源的模板引擎.没错,它就是著名的php模板引擎之Java移植版. 它特点就是将模板文件或者字符串编译成java类直接执行,所以效率比一般的模板解释的方式处理要快.它发展较晚,所 ...

  2. MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多

    一.用到的实体类如下: Student.java package com.company.entity; import java.io.Serializable; import java.util.D ...

  3. netcore webCache缓存

    NetCoreCacheService.dll public IActionResult Index() { //存入字符串 MemoryCacheService.SetChacheValue(&qu ...

  4. VM ubuntu18.04.01虚拟机没办法联网

    sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service ...

  5. loadrunner 手动添加关联

    以loadrunner自带的订票系统为例 1.录制两次订票流程 2.比较两次不同点(Tools ->Compare with script) 3.找到服务器返回的动态值 4.回到Script模式 ...

  6. 【capstone/ropgadget】环境配置

    具体环境配置可参考 https://github.com/JonathanSalwan/ROPgadget/tree/master 作者给出的安装方式 但具体配置中出现了问题,如引用时出现如下错误: ...

  7. 刷题21. Merge Two Sorted Lists

    一.题目说明 这个题目是21. Merge Two Sorted Lists,归并2个已排序的列表.难度是Easy! 二.我的解答 既然是简单的题目,应该一次搞定.确实1次就搞定了,但是性能太差: R ...

  8. JAVAWEB limit 分页 (转载)

    原文来自于      https://www.jianshu.com/p/553fc76bb8eb  作者写的很不错 只是为了自己方便学习转载的  代码我就不贴了 我是 Oracle 要改一些代码 原 ...

  9. Window Server 2019 配置篇(2)- 在window server core上安装网络跟DHCP服务

    上一篇我们已经建立了自己的域服务器 之后我们将安装一个window server core,也就是没有GUI只有命令行的window server,并在其上安装网络服务和DHCP 首先创建一个新的虚拟 ...

  10. POJ 1565:Skew Binary

    Skew Binary Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10676   Accepted: 6807 Desc ...