【题目描述】 你需要构造一个1~n的排列,使得它满足m个条件,每个条件形如(ai,bi),表示ai必须在bi前面。 在此基础上,你需要让1尽可能靠前,然后你需要让2尽可能靠前,然后是3,4,5,…,n。

【输入数据】 第一行两个正整数n,m。接下来m行每行两个数ai,bi。

【输出数据】 输出一行n个整数表示答案。如果不存在这样的排列,输出-1。

【样例输入】 5 4 5 4 5 3 4 2 3 2

【样例输出】 1 5 3 4 2

【数据范围】 对于20%的数据,n,m<=10。 对于40%的数据,n,m<=200。 对于60%的数据,n,m<=1000。 对于100%的数据,n,m<=100000。

对于每组条件连一条有向边, 然后对形成的图进行拓扑排序,

每次拿出的点放入大根堆中,依序输出并删边,最后将所有输出结果反序。

(第一次做理解成了“字典序最小”,就拿了二十分……)

原理上:倒着建图,用堆求出一个字典序最大的拓扑序,反过来输出即可。

正确性可以用反证法证明。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. priority_queue<int> q;
  5. vector<int> v[];
  6.  
  7. int c[], ans[];
  8. int n, m;
  9. int ecnt=, acnt=;
  10.  
  11. void dlt(int num){
  12. ans[acnt++] = num;
  13. for(int i=; i<v[num].size(); i++){
  14. if(c[v[num][i]] == ) q.push(v[num][i]);
  15. c[v[num][i]]--;
  16. }
  17. }
  18. int main(){
  19. freopen("dictionary.in", "r", stdin);
  20. freopen("dictionary.out", "w", stdout);
  21. scanf("%d%d", &n, &m);
  22.  
  23. for(int i=; i<m; i++){
  24. int t1, t2;
  25. scanf("%d%d", &t1, &t2);
  26. v[t2].push_back(t1);
  27. c[t1]++;
  28. }
  29. for(int i=; i<=n; i++){
  30. if(c[i] == ){
  31. q.push(i);
  32. }
  33. }
  34. while(true){
  35. if(q.empty()) break;
  36. int temp = q.top();
  37. q.pop();
  38. dlt(temp);
  39. }
  40. if(acnt==n){
  41. for(int i=n-; i>=; i--)
  42. printf("%d ", ans[i]);
  43. }
  44. else printf("-1");
  45. return ;
  46. }

暑期集训20190729 字典序(dictionary)的更多相关文章

  1. SDU暑期集训排位(5)

    SDU暑期集训排位(5) A. You're in the Army Now 题意 类似选志愿.每个人有 mark,有优先级从高到低的志愿. 做法 定睛一看,鲨鼻题.然后 WA. 为什么会 WA 呢? ...

  2. SDU暑期集训排位(4)

    SDU暑期集训排位(4) C. Pick Your Team 题意 有 \(n\) 个人,每个人有能力值,A 和 B 轮流选人,A 先选,B 选人按照一种给出的优先级, A 可以随便选.A 想最大化己 ...

  3. 2014年CCNU-ACM暑期集训总结

    2014年CCNU-ACM暑期集训总结 那个本期待已久的暑期集训居然就这种.溜走了.让自己有点措手不及.很多其它的是对自己的疑问.自己是否能在ACM这个领域有所成就.带着这个疑问,先对这个暑假做个总结 ...

  4. 8.10 正睿暑期集训营 Day7

    目录 2018.8.10 正睿暑期集训营 Day7 总结 A 花园(思路) B 归来(Tarjan 拓扑) C 机场(凸函数 点分治) 考试代码 A B C 2018.8.10 正睿暑期集训营 Day ...

  5. 8.6 正睿暑期集训营 Day3

    目录 2018.8.6 正睿暑期集训营 Day3 A 亵渎(DP) B 绕口令(KMP) C 最远点(LCT) 考试代码 A B C 2018.8.6 正睿暑期集训营 Day3 时间:5h(实际) 期 ...

  6. 8.9 正睿暑期集训营 Day6

    目录 2018.8.9 正睿暑期集训营 Day6 A 萌新拆塔(状压DP) B 奇迹暖暖 C 风花雪月(DP) 考试代码 A B C 2018.8.9 正睿暑期集训营 Day6 时间:2.5h(实际) ...

  7. 8.8 正睿暑期集训营 Day5

    目录 2018.8.8 正睿暑期集训营 Day5 总结 A 友谊巨轮(线段树 动态开点) B 璀璨光滑 C 构解巨树 考试代码 A B C 2018.8.8 正睿暑期集训营 Day5 时间:3.5h( ...

  8. 8.7 正睿暑期集训营 Day4

    目录 2018.8.7 正睿暑期集训营 Day4 A 世界杯(贪心) B 数组(线段树) C 淘汰赛 考试代码 A B C 2018.8.7 正睿暑期集训营 Day4 时间:5h(实际) 期望得分:. ...

  9. 8.5 正睿暑期集训营 Day2

    目录 2018.8.5 正睿暑期集训营 Day2 总结 A.占领地区(前缀和) B.配对(组合) C 导数卷积(NTT) 考试代码 T1 T2 T3 2018.8.5 正睿暑期集训营 Day2 时间: ...

随机推荐

  1. Shell之StdI/O和Pipe

    目录 Shell之StdI/O和Pipe 参考 StdI/O重定向 Pipe 常用组合 Shell之StdI/O和Pipe

  2. 一个简单的Eclipse调试Debug流程(四)

    本文链接:https://blog.csdn.net/u011781521/article/details/55000066    http://blog.csdn.net/u010075335/ar ...

  3. FFmpeg(三) 编解码相关函数理解

    一.编解码基本流程 主要流程: 打开视频解码器(音频一样) 软解码.硬解码 进行编解码 下面先来看打开视频解码器 ①avcodec_register_all()//初始化解码 ②先找到解码器. 找解码 ...

  4. 从0开始学FreeRTOS-(创建任务)-2

    # 补充 开始今天的内容之前,先补充一下上篇文章[从单片机到操作系统-1](https://jiejietop.gitee.io/freertos-1/)的一点点遗漏的知识点. ```js BaseT ...

  5. CocosCreator 快速开发推箱子游戏,附代码

    游戏总共分为4个功能模块: - 开始游戏(menuLayer) - 关卡选择(levelLayer) - 游戏(gameLayer) - 游戏结算(gameOverLayer) Creator内组件效 ...

  6. Stock Charts

    Description You're in the middle of writing your newspaper's end-of-year economics summary, and you' ...

  7. HDU - 1512  Monkey King

    Problem Description Once in a forest, there lived N aggressive monkeys. At the beginning, they each ...

  8. Html中解决点击 a 标签刷新的问题,实现点击时不刷新

    Html中解决点击 a 标签刷新的问题 我们可以在 <a href=""></a>中,将地址属性href设置为“#” 例如 <a href=" ...

  9. How to Get What You Want 如何得到你想要的

    [1]If you want something, give it away. [2]When a farmer wants more seeds, he takes his seeds and gi ...

  10. DJango错误日志生成

    DJango错误日志生成 setting.py设置 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': ...