BZOJ 4010 菜肴制作
Description
知名美食家小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\):共\(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!” (不含引号,首字母大写,其余字母小写)
Input
第一行是一个正整数\(D\),表示数据组数。
对于每组数据:
第一行两个用空格分开的正整数\(N\)和\(M\),分别表示菜肴数目和制作顺序限制的条目数。
接下来\(M\)行,每行两个正整数\(x,y\),表示“\(x\)号菜肴必须先于\(y\)号菜肴制作”的限制。(注意:\(M\)条限制中可能存在完全相同的限制)
Output
输出文件仅包含\(D\)行,每行\(N\)个整数,表示最优的菜肴制作顺序,或者”Impossible!”表示无解(不含引号)。
Sample Input
3
5 4
5 4
5 3
4 2
3 2
3 3
1 2
2 3
3 1
5 2
5 2
4 3
Sample Output
1 5 3 4 2
Impossible!
1 5 2 4 3
Hint
\(N,M \le 100000,D \le 3\)
Solution
考试的时候打的\(70'\)做法,即从小到大依次确定可以放置的最前的位置。复杂度\(O(n^{2})\)。
正解的做法很简单,却并不好像,好像跟NOI2010航空管制很像。
将图反连,我们从小到大确定每个最前的位置,即在反top序中从小到大最后的位置。我们还是topsort,只是每次取出的点是所有入度为\(0\)的标号最大的点。这要的贪心 ,我们就可以保证编号小的尽可能的在后面。最后将top序反着输出即可。
#include<iostream>
#include<set>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
#define maxn (100010)
int d[maxn],side[maxn],next[maxn*2],toit[maxn*2],ans[maxn],cnt,n,m;
inline void add(int a,int b) { next[++cnt] = side[a]; side[a] = cnt; toit[cnt] = b; ++d[b]; }
struct cmp { inline bool operator ()(const int &a,const int &b) { return a>b; } };
set <int,cmp> S;
inline bool topsort()
{
int tot = 0;
for (int i = 1;i <= n;++i) if (!d[i]) S.insert(i);
while (!S.empty())
{
int now = *S.begin(); S.erase(S.begin());
ans[++tot] = now;
for (int i = side[now];i;i = next[i]) if (!--d[toit[i]]) S.insert(toit[i]);
}
return tot == n;
}
int main()
{
freopen("4010.in","r",stdin);
freopen("4010.out","w",stdout);
int T; scanf("%d",&T);
while (T--)
{
scanf("%d %d",&n,&m);
for (int i = 1,a,b;i <= m;++i) scanf("%d %d",&a,&b),add(b,a);
if (!topsort()) printf("Impossible!");
else for (int i = n;i;--i) printf("%d ",ans[i]);
puts("");
memset(side,0,4*(n+1));
memset(d,0,4*(n+1));
cnt = 1;
}
fclose(stdin); fclose(stdout);
return 0;
}
BZOJ 4010 菜肴制作的更多相关文章
- bzoj 4010 [HNOI2015]菜肴制作——贪心
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4010 和 bzoj 2535 差不多.因为当前怎么决策与该点后面连的点的标号情况有关,所以按 ...
- 【BZOJ】【4010】【HNOI2015】菜肴制作
拓扑排序 这题是要求N个点的一个拓扑序,且满足以下条件:编号1的位置尽可能靠前,在此基础上编号2的位置尽可能靠前…… 我看到这题的第一感觉:将拓扑排序用的队列改为优先队列,编号越小越早出来. 但是连样 ...
- bzoj 4010: [HNOI2015]菜肴制作 拓扑排序
题目链接: 题目 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB 问题描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴 ...
- BZOJ 4010: [HNOI2015]菜肴制作( 贪心 )
把图反向,然后按拓扑序贪心地从大到小选, 最后输出.set比priority_queue慢... --------------------------------------------------- ...
- [BZOJ 4010][HNOI 2015] 菜肴制作
4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 1776 Solved: 889[Submit][Status ...
- bzoj 4010: [HNOI2015]菜肴制作
Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号 ...
- 【BZOJ 4010】 [HNOI2015]菜肴制作
Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号为 ...
- BZOJ-4010 菜肴制作 贪心+堆+(拓扑图拓扑序)
无意做到...char哥还中途强势插入干我...然后据他所言,看了一会题,一转头,我爆了正解....可怕 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory L ...
- 拓扑排序 最大字典序+优先队列 BZOJ 4010
http://www.lydsy.com/JudgeOnline/problem.php?id=4010 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory ...
随机推荐
- [Redux] Colocating Selectors with Reducers
We will learn how to encapsulate the knowledge about the state shape in the reducer files, so that t ...
- [D3] 10. Creating Axes with D3
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 条带深度 队列深度 NCQ IOPS
http://blog.csdn.net/striping/article/details/17449653 IOPS 即I/O per second,即每秒进行读写(I/O)操作的次数,多用于数据库 ...
- Python 基础学习
http://www.cnblogs.com/Wxtrkbc/p/5486253.html
- ViewPager的用法
ViewPager 1.布局文件中的配置 ViewPager的路径 方法:在源码文件中输入ViewPager,按下alt+/,上面就会出来viewPager的包路径 viewPager的配置很简单,前 ...
- python学习笔记--Django入门0 安装dangjo
经过这几天的折腾,经历了Django的各种报错,翻译的内容虽然不错,但是与实际的版本有差别,会出现各种奇葩的错误.现在终于找到了解决方法:查看英文原版内容:http://djangobook.com/ ...
- Validation Rule和Binding Group
WPF学习之绑定-Validation Rule和Binding Group 在上一篇文章中我们讨论了有关WPF绑定的知识点,现在我们可以很容易的将业务数据作为源绑定到WPF控件并可以通过创建不同的D ...
- Customize the SharePoint 2013 search experience with a Content Enrichment web service
Did you ever wish you had more control over how your content is indexed and presented as search resu ...
- web前端:html
一.理解表单的作用 1.web 应用程序不仅仅是给用户显示数据,还应该给用户提供一个可以输入数据的图形用户界面.表单的主要作用在于在网页上提供一个图形用户界面,已采集和提交用户输入的数据. 2.htm ...
- 如何处理Tomcat日志catalina.out日志文件过大的问题
tomcat默认日志文件为catalina.out,随着系统运行时间的增加,该日志文件大小会不断增大,甚至增大到G级.不仅会导致我们无法使用常规工具查找系统问题,而且会影响tomcat性能(比如我在维 ...