题目描述

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

由于菜肴之间口味搭配的问题,某些菜肴必须在另一些菜肴之前制作,具体的,一共有 M 条形如”i 号菜肴'必须'先于 j 号菜肴制作“的限制,我们将这样的限制简写为<i,j>。

现在,酒店希望能求出一个最优的菜肴的制作顺序,使得小 A能尽量先吃到质量高的菜肴:

也就是说,

(1)在满足所有限制的前提下,1 号菜肴”尽量“优先制作;

(2)在满足所有限制,1号菜肴”尽量“优先制作的前提下,2号菜肴”尽量“优先制作;

(3)在满足所有限制,1号和2号菜肴”尽量“优先的前提下,3号菜肴”尽量“优先制作

;(4)在满足所有限制,1 号和 2 号和 3 号菜肴”尽量“优先的前提下,4 号菜肴”尽量“优先制作;

(5)以此类推。

例1:共4 道菜肴,两条限制<3,1>、<4,1>,那么制作顺序是 3,4,1,2。

例2:共5道菜肴,两条限制<5,2>、 <4,3>,那么制作顺序是 1,5,2,4,3。

例1里,首先考虑 1,因为有限制<3,1>和<4,1>,所以只有制作完 3 和 4 后才能制作 1,而根据(3),3 号又应”尽量“比 4 号优先,所以当前可确定前三道菜的制作顺序是 3,4,1;接下来考虑2,确定最终的制作顺序是 3,4,1,2。

例 2里,首先制作 1是不违背限制的;接下来考虑 2 时有<5,2>的限制,所以接下来先制作 5 再制作 2;接下来考虑 3 时有<4,3>的限制,所以接下来先制作 4再制作 3,从而最终的顺序是 1,5,2,4,3。 现在你需要求出这个最优的菜肴制作顺序。无解输出”Impossible!“ (不含引号,首字母大写,其余字母小写)

输入输出格式

输入格式:

第一行是一个正整数D,表示数据组数。 接下来是D组数据。 对于每组数据: 第一行两个用空格分开的正整数N和M,分别表示菜肴数目和制作顺序限制的条目数。 接下来M行,每行两个正整数x,y,表示”x号菜肴必须先于y号菜肴制作“的限制。(注意:M条限制中可能存在完全相同的限制)

输出格式:

输出文件仅包含 D 行,每行 N 个整数,表示最优的菜肴制作顺序,或者“Impossible!“表示无解(不含引号)。

输入输出样例

输入样例#1:

  1. 3
  2. 5 4
  3. 5 4
  4. 5 3
  5. 4 2
  6. 3 2
  7. 3 3
  8. 1 2
  9. 2 3
  10. 3 1
  11. 5 2
  12. 5 2
  13. 4 3
输出样例#1:

  1. 1 5 3 4 2
  2. Impossible!
  3. 1 5 2 4 3

说明

【样例解释】

第二组数据同时要求菜肴1先于菜肴2制作,菜肴2先于菜肴3制作,菜肴3先于

菜肴1制作,而这是无论如何也不可能满足的,从而导致无解。

100%的数据满足N,M<=100000,D<=3。

%%%yzh大佬orz

首先贪心可知,在满足拓扑序同时字典序最小

不过显然正向是不行的,因为因为后面的情况无法确定

不过只有一点是确定的,小的就放前面

所以从1开始,把它的前置菜都上了,接下来从未上菜再选一个,依此类推

那么怎麽保证1前置菜字典序最小?

反向保证字典序最大就行了

用一个堆维护的基础上拓扑排序

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. struct Node
  8. {
  9. int next,to;
  10. }edge[];
  11. int num,head[],du[],n,m,a[],ans[],tot,cnt;
  12. int vis[];
  13. priority_queue<int>q;
  14. int Q[]={};
  15. int gi()
  16. {int x=;
  17. char ch=getchar();
  18. while (ch<''||ch>'') ch=getchar();
  19. while (ch>=''&&ch<='')
  20. {
  21. x=(x<<)+(x<<)+ch-'';
  22. ch=getchar();
  23. }
  24. return x;
  25. }
  26. void add(int u,int v)
  27. {
  28. num++;
  29. edge[num].next=head[u];
  30. head[u]=num;
  31. edge[num].to=v;
  32. }
  33. bool pd()
  34. {int i,u,v;
  35. while (q.empty()==) q.pop();
  36. for (i=;i<=n;i++)
  37. if (du[i]==) q.push(i);
  38. while (q.empty()==)
  39. {
  40. u=q.top();
  41. q.pop();
  42. for (i=head[u];i;i=edge[i].next)
  43. {
  44. v=edge[i].to;
  45. du[v]--;
  46. if (du[v]==)
  47. {
  48. q.push(v);
  49. }
  50. }
  51. }
  52. for (i=;i<=n;i++)
  53. if (du[i]) return ;
  54. return ;
  55. }
  56. void topsort(int x)
  57. {int i,u,v;
  58. while (!q.empty()) q.pop();
  59. q.push(x);
  60. while (q.empty()==)
  61. {
  62. u=q.top();
  63. q.pop();
  64. a[++tot]=u;
  65. for (i=head[u];i;i=edge[i].next)
  66. {
  67. v=edge[i].to;
  68. if (vis[v]!=x) continue;
  69. du[v]--;
  70. if (du[v]==)
  71. {
  72. q.push(v);
  73. }
  74. }
  75. }
  76. }
  77. void bfs(int x)
  78. {int i;
  79. vis[x]=x;
  80. int h=,t=,u,v;
  81. Q[]=x;
  82. while (h<t)
  83. {
  84. h++;
  85. u=Q[h];
  86. for (i=head[u];i;i=edge[i].next)
  87. {
  88. v=edge[i].to;
  89. if (vis[v]==)
  90. {
  91. t++;
  92. Q[t]=v;
  93. vis[v]=x;
  94. }
  95. if (vis[v]==x) du[v]++;
  96. }
  97. }
  98. }
  99. int main()
  100. {int T,i,j,u,v;
  101. cin>>T;
  102. while (T--)
  103. {num=;cnt=;
  104. memset(head,,sizeof(head));
  105. memset(vis,,sizeof(vis));
  106. memset(du,,sizeof(du));
  107. cin>>n>>m;
  108. for (i=;i<=m;i++)
  109. {
  110. u=gi();v=gi();
  111. add(v,u);
  112. du[u]++;
  113. }
  114. if (!pd())
  115. {
  116. cout<<"Impossible!\n";
  117. }
  118. else
  119. {
  120. memset(vis,,sizeof(vis));
  121. for (i=;i<=n;i++)
  122. if (vis[i]==)
  123. {
  124. tot=;
  125. bfs(i);
  126. topsort(i);
  127. for (j=tot;j>=;j--)
  128. ans[++cnt]=a[j];
  129. }
  130. for (i=;i<=cnt;i++)
  131. printf("%d ",ans[i]);
  132. cout<<endl;
  133. }
  134. }
  135. }

[HNOI2015]菜肴制作的更多相关文章

  1. bzoj 4010: [HNOI2015]菜肴制作 拓扑排序

    题目链接: 题目 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB 问题描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴 ...

  2. BZOJ 4010: [HNOI2015]菜肴制作( 贪心 )

    把图反向,然后按拓扑序贪心地从大到小选, 最后输出.set比priority_queue慢... --------------------------------------------------- ...

  3. P3243 [HNOI2015]菜肴制作(拓扑排序)

    P3243 [HNOI2015]菜肴制作 题目误导你正着做拓扑排序,然鹅你可以手造数据推翻它.于是就只能倒着做 我们开个优先队列,每次把可填的最大的编号取出来搞,最后倒着输出拓扑序就好辣 #inclu ...

  4. bzoj 4010 [HNOI2015]菜肴制作——贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4010 和 bzoj 2535 差不多.因为当前怎么决策与该点后面连的点的标号情况有关,所以按 ...

  5. 【BZOJ4010】[HNOI2015]菜肴制作 拓扑排序

    [BZOJ4010][HNOI2015]菜肴制作 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高 ...

  6. BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心

    BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜 ...

  7. [HNOI2015]菜肴制作 题解(自带口胡证明)

    [HNOI2015]菜肴制作 时间限制: 1 Sec  内存限制: 512 MB 题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为 ...

  8. [HNOI2015]菜肴制作贪心的证明

    [HNOI2015]菜肴制作贪心的证明 先吐槽一句为什么网上都没人证这个东西,我觉得一点也不显然啊... 判环不用说了,现在处理一个DAG.考虑按题意模拟:建反图(边从后选的点连向先选的点),每次找全 ...

  9. 【题解】[HNOI2015]菜肴制作(贪心+topo序)

    [题解][HNOI2015]菜肴制作(贪心+topo序) 题意:请你构造一个排列\(p[i]\)使得对于数组\(arc[i]=p[i]\)的字典序最小,并且对于给定的有序数对\((u,v)\)保证你给 ...

  10. [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序

    菜肴制作 bzoj-4010 HNOI-2015 题目大意:给定一张n个点m条边的有向图,求一个toposort,使得:(1)满足编号为1的点尽量在前:(2)满足(1)的情况下编号为2的点尽量在前,以 ...

随机推荐

  1. Beta冲刺第七天

    一.昨天的困难 没有困难. 二.今天进度 1.林洋洋:MD图片上传,修复权限问题,修复本地存储判空问题,修复协作申请没有过滤问题. 2.黄腾达:添加文件链接和邀请链接复制功能,协作树界面优化. 3.张 ...

  2. alpha-咸鱼冲刺day8

    一,合照 emmmmm.自然还是没有的. 二,项目燃尽图 三,项目进展 正在进行页面整合.然后还有注册跟登陆的功能完善-- 四,问题困难 数据流程大概是搞定了.不过语法不是很熟悉,然后还有各种判定. ...

  3. Twisted UDP编程技术

    实战演练1:普通UDP UDP是一种无连接对等通信协议,没有服务器和客户端概念,通信的任何一方均可通过通信原语直接和其他方通信 1.相对于TCP,UDP编程只需定义DatagramProtocol子类 ...

  4. java关于for循环。

    众所周知,JAVA中for循环的基本格式为: for(初始化表达式:布尔表达式:循环后更新表达式){循环体} 举个例子来说可以写成 (1)for (int x=1;x<10;x++){ Syst ...

  5. easyUI combobox 添加空白项

    今天测试反馈了一个问题,希望可以在下拉框下面加一个空白的选项(下拉框用的是combobox方法). 开始分析这个问题: 首先,这个数据都是后台读出来的,那么我在后台直接添加可以么,答案是可以的,如果没 ...

  6. Scala 操作符与提取器

    实际上Scala没有操作符, 只是以操作符的格式使用方法. 操作符的优先级取决于第一个字符(除了赋值操作符), 而结合性取决于最后一个字符 Scala的操作符命名更加灵活:) 操作符 中置操作符(In ...

  7. Node入门教程(2)第一章:NodeJS 概述

    Node 概述 什么是 Node Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...

  8. 消除ExtJS6的extjs-trila字样

  9. HttpClient 上传多个文件

    using (System.Net.Http.HttpClient client = new System.Net.Http.HttpClient()) { client.BaseAddress = ...

  10. vuex在项目中使用的一点总结

    以下为vue后台管理项目中使用vuex的一点总结,截取了其中部分代码,如有什么错误,还望指出. 1. token 存储 登陆成功之后,需要把获取到的 token 存储到 vuex 中,配合 axios ...