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 ...
随机推荐
- WCF探索之旅(一)——入门
背景 对于.NET程序员来说,假设你不知道WCF,那仅仅能说明一点:你还是个菜鸟. 曾经也用.NET做过几个系统,尤其做后面的系统的时候,心里就有点沾沾自喜了! 想着,.NET也就这点东西,我如今也能 ...
- PCAP 文件内容解析命令
针对网络接口.端口和协议的数据包截取.假定你要截取网络接口eth1,端口号6881的tcp数据包.数据文件保存为test.pcap. tcpdump -w test.pcap -i eth1 tcp ...
- C# 网络编程之网页自动登录 (一).使用WebBrower控件模仿登录
最近学习C#网络编程中,想实现网页自动登录并提交GET/POST信息,再实现循环登录不断发送报文给服务器,服务器发送消息给客户端记录能登录的账户和密码,做到后面实现绕过验证码.动态抓取登录位置等,但由 ...
- 浮动闭合方案:clearfix
1 ;clear:both;visibility:hidden} .clearfix{*+height:1%;} 2 .clearfix{overflow:auto;_height:1%} 3 ;}
- switch vpn 配置
- android线程与线程池-----线程池(二)《android开发艺术与探索》
android 中的线程池 线程池的优点: 1 重用线程池中的线程,避免了线程的创建和销毁带来的性能开销 2 能有效的控制最大并发数,避免大量线程之间因为喜欢抢资源而导致阻塞 3 能够对线程进行简单的 ...
- 在命令行中如何访问Program Files文件夹(转)
通常来说Program Files文件夹位于C盘,也就是C:\Program File.为了保证兼容性,在命令行中通常使用环境变量%ProgramFiles%来表示Program Files的具体路径 ...
- MORE ABORT AWR?
For some time, Oracle’s solution in this area has been its built-in tool, Statspack.Oracle Database ...
- phpmyadmin备份小问题
不要将imformation——shame或者mysql等备份,要有选择的备份表 关注我的新浪微博
- IOS pop使用代理传值
假如oneViewController页面push到OtherViewController页面,然后你想从OtherViewController页面pop到oneViewController页面的时候 ...