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 ...
随机推荐
- [Javascript] Immutable opreators
slice filter map ...spread concat Object.assign let items = [1,2,3]; //add let newItems = [...items, ...
- DTRACE 专家
http://dtrace.org/blogs/bmc/ https://github.com/bcantrill http://www.tudou.com/programs/view/Q6fHZFg ...
- GDB 调试程序系列
http://blog.csdn.net/haoel/article/category/9197
- Android开发之设定Dialog的位置
今天自定义了一个对话框,但是弹出时默认是显示在屏幕中间.主要代码:menuDialog = new AlertDialog.Builder(this).create(); ...
- VS中新建网站和新建项目web应用程序的区别?(实际应用总结一点)
1,在网站中是没有命名空间namespace这个概念的.例如公共类只有放在App_Code里(不但是公共类,所有的类都应放在这里),其他的类或者页面才可以引用.有using这个概念,但没有namesp ...
- CSS样式表其它知识点
1.cursor:pointer鼠标放到上面变形状,pointer为手 2.margin:auto 页面居中 3.显示方式:dispaly:none不显示/block 块换行/inline在一行上,宽 ...
- ASP.NET MVC 第六回 过滤器Filter
在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能 判断登录与否或用户权限 决策输出缓存 防盗链 防蜘蛛 本地化与国际化设置 实现动态Action Filter是一种声明式编 ...
- asp.net mvc+web api+easyui
前奏:第一次写博客,记录一下学习和开发的过程. 现在写的是一个后台管理系统,有基本的权限功能,其他功能都可以扩展.用到的技术是 asp.net mvc5,web api 2,entityframewo ...
- Socket 错误一览表
出现网络联机错误Socket error #11001 表示您的计算机无法连上服务器,请检查您的Proxy设定以及Proxy相关账号,或暂时取消您防毒软件的「个人防火墙」. · 出现网络联机错误Soc ...
- C# 读取txt文本内容写入到excel
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...