题意:n个结点,m个拓扑关系(a,b)表示a必须排在b前面,在满足m个拓扑关系关系的前提下使得小的结点尽可能的排在前面。也就是说我们现在要从1号结点开始考虑,如果要排1号结点,根据拓扑关系,首先必须排哪些结点,如果排好了1号结点,则继续考虑2号结点 ,3号结点。。
我们先看两个例子:
存在拓扑关系:
5 -> 3 -> 1
6 -> 4 -> 2
直接拓扑排序的结果是 5 3 1 6 4 2,结果是正确的(1号尽可能的在前面了) ,看起来好像直接拓扑排序就可以了,但是为什么提交后却wa了呢,别急,我们再看一个例子:
6 -> 3 -> 1
5 -> 4 -> 2
直接拓扑排序的结果是:5 4 2 6 3 1 ,结果是错误的,因为我们可以把1号安排到更前面的位置 即:6 3 1 5 4 2(正确答案)。
看到这里应该就知道为什么直接拓扑排序不行了吧,我们分析一下为什么会出现这样的状况,对于多条弧或者边,我们是先删除弧尾结点比较小的结点即(5号结点比6号结点小,先删除以该点为尾的弧),而这也正是问题所在,我们希望的是优先删除弧头比较小的弧的(1号结点比2号结点小,因优先删除以1号为头的弧)。
好了,问题找到了,现在我们在来想如何解决问题,我们可以尝试一下逆向思维,即我们先考虑哪些点应该靠后释放,这样的话我们就可以把拓扑关系反过来(即弧头和弧尾调换),然后做拓扑排序,然后我们可以根据原来的弧头(现在变成弧尾)的大小来释放结点,由于现在的问题变成哪些最后释放,那么就应该优先考虑弧尾(原来的弧头)比较大的,可以通过优先队列来解决。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
#include<utility>
using namespace std;
const int maxn = 31000;
pair<int,int> a[maxn * 4];
int h[maxn];
int in[maxn];
int ans[maxn],cnt;
int main()
{int tt;scanf("%d",&tt);int x,y;while(tt--){int n,m;memset(h,0,sizeof(h));memset(in,0,sizeof(in));scanf("%d%d",&n,&m);cnt = 0;for(int i=1;i<=m;i++){scanf("%d%d",&y,&x);if(h[x] == 0){h[x] = i;a[i].first = y;a[i].second = 0;in[y]++;}else{int t = h[x];h[x] = i;a[i].first = y;a[i].second = t;in[y]++;}}priority_queue<int,vector<int>, less<int> > que;for(int i=1;i<=n;i++)if(in[i] == 0) que.push(i);while( !que.empty()){int top = que.top();que.pop();ans[cnt++] = top;for(int i = h[top];i!=0;i = a[i].second){in[a[i].first]--;if(in[a[i].first] == 0)que.push(a[i].first);}}for(int i=cnt -1 ;i > 0;i--)printf("%d ",ans[i]);printf("%d\n",ans[0]);}
}

反向拓扑排序 HDU 4857 逃生相关推荐

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

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

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

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

  3. hdu 4857 逃生 拓扑排序

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

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

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

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

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

  6. 图论——AOV网络及拓扑排序

    引入 有向无环图(DAG) 如果一个有向图不存在环,也就是任意结点都无法通过一些有向边回到自身,那么称这个有向图为有向无环图 AOV 网络 在有向图中,用顶点表示活动,用有向边<Vi,Vj> ...

  7. HDU 4857 拓扑排序 优先队列

    n个数,已经有大小关系,现给m个约束,规定a在b之前,剩下的数要尽可能往前移.输出序列 大小关系显然使用拓扑结构,关键在于n个数本身就有大小关系,那么考虑反向建图,优先选择值最大的入度为零的点,这样得 ...

  8. (HDU - 4857)逃生(拓扑+思维)

    题目链接:Problem - 4857 (hdu.edu.cn) 本题就是让我们在他给定的前后顺序前提下求出对应的拓扑排序,要保证小号尽量靠前. 我刚开始做这道题目时就直接认为这就是一个拓扑排序模板, ...

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

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

最新文章

  1. python之33个关键字详解_Python 中的关键字 with 详解
  2. jtag和swd的区别
  3. 注释驱动的 Spring cache 缓存介绍--转载
  4. data:image/png;base64,, CTF杂项base64图片隐写-河南省第二届金盾信安杯
  5. Android 编码规范:(六)消除过期的对象引用
  6. linux dup跨进程使用,linuxC多进程通讯---无名管道dup
  7. 前端开发教程:使用 CSS3 Transforms 构建圆形导航
  8. openssl 升级
  9. SeDebugPrivilege
  10. 自己做量化交易软件(26)小白量化事件回测之MetaTrader5自动回测
  11. Qt显示wav波形图
  12. 服务器vmx 文件,ISO,虚拟机,VMware,VMX文件和VMDK文件之间的关系
  13. clickhouse-client命令行参数及常用案例
  14. 【四二学堂】标准GPS坐标,转换成百度坐标
  15. Ubuntu,CentOS安装TIM(QQ),liunx通用
  16. 飞机的纵•横向运动简化数学模型及控制系统设计
  17. Dev C++ 下载地址和安装教程
  18. JAVA将英文字母的大写字母转换为小写字母。
  19. CC1310 架构组成,TX/RX+WOR嗅探过程,低功耗方法
  20. asp行驶证识别,驾驶证识别api代码demo示例,还可以识别车牌

热门文章

  1. Windows下 使用Python来调用PotPlayer.exe来播放音频
  2. 巧克力慕斯的制作方法
  3. 【协议森林】Linux下socket编程KEEPALIVE使用与原理
  4. 高通下一代高端芯片参数泄露,与苹果A17差距拉大了
  5. ei计算机投稿 知乎,知乎热议:科研有很水的idea应该发表出来吗?
  6. Delphi CreateFile函数
  7. 简单明了操作——ESP8266 NodeMCU驱动TFT LCD液晶屏(制作透明小电视前奏)
  8. UG.NX.I-Deas.v6.0-ISO\
  9. uniapp头像回显加换头像
  10. Session是什么东西