题意:排序输出:在先满足定约束条件下(如 3必需在1前面,7必需在4前面),在满足:1尽量前,其次考虑2,依次。。。。。(即有次约束)。

开始的时候,只用拓扑,然后每次在都可以选的时候,优先考虑小的,其实没什么简单,如 图(3-->1,2)这样输出是2.3.1,正确应该是 3 1 2,因为 1要尽量前(都满足第一约束)。

参考他人思路结合自己理解:因为这样的弊端就是没有考虑这种情况:图中:若我的“子孙”中,有的比你次优先,虽然现在我们都可以输出,但是要考虑我的子代,若我的子代有次优先级比你高的,必需是我输出后,子代输出,你再输出。所以自然想到dfs查子代次优先级,这是一种方法,但是建逆图就可以解决这个问题,走逆图的拓扑序,选的时候选大的数,保存,由于逆图中,孩子次优先级高的必在前面了,直接可以和你比,按“大”的保存。

用优先队列刚好解决问题。

  1. #include<iostream>
  2. #include<stack>
  3. #include<vector>
  4. #include<queue>
  5. using namespace std;
  6. int n,m;int ind[32000];
  7. int main()
  8. {
  9. int T;
  10. cin>>T;
  11. while(T--)
  12. {
  13. cin>>n>>m;
  14. vector<vector<int> >e(n+1);
  15. for(int i=0;i<=n;i++)
  16. ind[i]=0;
  17. int a,b;
  18. while(m--)
  19. {
  20. cin>>a>>b;
  21. e[b].push_back(a);
  22. ind[a]++;
  23. }
  24. priority_queue<int>q;
  25. for(int i=1;i<=n;i++)
  26. {
  27. if(ind[i]==0)
  28. q.push(i);
  29. }
  30. vector<int>ans;
  31. while(!q.empty())
  32. {
  33. int cur=q.top();
  34. q.pop();
  35. ans.push_back(cur);
  36. for(int i=0;i<e[cur].size();i++)
  37. {
  38.  
  39. int v=e[cur][i];
  40. ind[v]--;
  41. if(ind[v]==0)
  42. q.push(v);
  43. }
  44. }
  45. for(int i=ans.size()-1;i>=0;i--)
  46. {
  47. if(i==0)cout<<ans[i]<<endl;
  48. else cout<<ans[i]<<" ";
  49. }
  50. }
  51. return 0;
  52. }

hdu 4857 逆拓扑+大根堆(priority_queue)的更多相关文章

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

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

  2. hdu 4857 反向拓扑问题

    尤其要注意拓扑的分层问题 不难理解 就是不怎么好想到 拓扑的思路这里就不累述了 #include <iostream> #include <cstdio> #include & ...

  3. hdu 4857 逃生 拓扑排序+逆向建图

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

  4. hdu 4857 逆向拓扑排序+反向输出

    /*一组测试实例 4 4 2 3 1 2 4 */ #include<stdio.h> #include<string.h> #include<queue> usi ...

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

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

  6. priority_queue()大根堆和小根堆(二叉堆)

    #include<iostream> #include <queue> using namespace std; int main() { //对于基础类型 默认是大顶堆 pr ...

  7. codeforce E - Minimal Labels+hdu 4857

    两个题目的意思差不多 都是希望得出的拓扑序如果有多种 要求输出字典序小的情况 这里引用一个大佬的博客 关于为什么不能直接建图然后用小根堆解决这个问题(http://blog.csdn.net/rgno ...

  8. BZOJ4010[HNOI2015]菜肴制作——拓扑排序+堆

    题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴 ...

  9. 【bzoj4010】[HNOI2015]菜肴制作 拓扑排序+堆

    题目描述 给你一张有向图,问:编号-位置序(即每个编号的位置对应的序列)最小(例如1优先出现在前面,1位置相同的2优先出现在前面,以此类推)的拓扑序是什么? 输入 第一行是一个正整数D,表示数据组数. ...

随机推荐

  1. plsql循环的简单实例

    declare v_id tbl_regions.regions_id%type; begin .. loop select t.regions_id into v_id from tbl_regio ...

  2. shell脚本,awk合并一列的问题。

    文件 file2内容如下:0 qwert1 asdfghjk2 asdjkl2 zxcvbn3 dfghjkll4 222224 tyuiop4 bnm 让第一列相等的合并成一行,不要第一列,也就是变 ...

  3. Alert and Action sheets and Timer and Animation

  4. NOIp2018心得

    NOIp2018 身为一名只会PJ的蒟蒻 我带着试试的心态(为了省一次中考哈哈哈) 同时报了PJ和TG??! TGD1T1是一道洛谷原题 都是提高组签到题 铺设道路 本蒻好像A了 然而某些dalao们 ...

  5. Mysql 5.7在Linux上部署及远程访问

    序言:最近要和伙伴一起组队,做.NET Core项目.所以自己就租了一个阿里云服务器,并且装了Linux和MySQL.这里面我的Linux是CentOs 7. 第一步 添加Mysql Yum库 这里面 ...

  6. 【编码】【转发】enca 转换编码

    enca用法如下: enca -L zh_CN file 检查文件的编码 enca -L zh_CN -x UTF-8 file 将文件编码转换为"UTF-8"编码 enca -L ...

  7. 使用selenium和phantomJS浏览器获取网页内容的小演示

    # 使用selenium和phantomJS浏览器获取网页内容的小演示 # 导入包 from selenium import webdriver # 使用selenium库里的webdriver方法调 ...

  8. 一个线程中lock用法的经典实例

    /* 该实例是一个线程中lock用法的经典实例,使得到的balance不会为负数 同时初始化十个线程,启动十个,但由于加锁,能够启动调用WithDraw方法的可能只能是其中几个 作者:http://h ...

  9. 爬虫开发python工具包介绍 (4)

    本文来自网易云社区 作者:王涛 此处我们给出几个常用的代码例子,包括get,post(json,表单),带证书访问:Get 请求 @gen.coroutine def fetch_url():     ...

  10. POJ 1006 生理周期【数论】

    这题是有中文版的(右上角选项卡里把default改成简体中文)然后看到他把biorhythms翻成生理周期我可耻的笑了......23333 如果没有限定从日期d开始,完全可以从第一天起开始计时,因此 ...