4010: [HNOI2015]菜肴制作

Time Limit: 5 Sec  Memory Limit: 512 MB

Submit: 981  Solved: 480

[Submit][Status][

id=4010" style="color:blue; text-decoration:none">Discuss]

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 号和 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!” (不含引號,
首字母大写,其余字母小写) 

Input

第一行是一个正整数D,表示数据组数。

接下来是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

【例子解释】

第二组数据同一时候要求菜肴1先于菜肴2制作,菜肴2先于菜肴3制作,菜肴3先于
菜肴1制作。而这是不管怎样也不可能满足的。从而导致无解。 
100%的数据满足N,M<=100000,D<=3。

Source

拓扑排序。思路不错。

将全部边反向,求字典序最大的拓扑序列。再反过来。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
#define maxn 100005
using namespace std;
struct edge{int next,to;}e[maxn];
int t,n,m,cnt,tot;
int d[maxn],ans[maxn],head[maxn];
priority_queue<int> q;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline void add_edge(int x,int y)
{
e[++cnt]=(edge){head[x],y};head[x]=cnt;
}
int main()
{
t=read();
while (t--)
{
n=read();m=read();
cnt=tot=0;
memset(head,0,sizeof(head));
memset(d,0,sizeof(d));
F(i,1,m)
{
int x=read(),y=read();
add_edge(y,x);
d[x]++;
}
F(i,1,n) if (!d[i]) q.push(i);
while (!q.empty())
{
int x=q.top();q.pop();
ans[++tot]=x;
for(int i=head[x];i;i=e[i].next)
{
int y=e[i].to;
d[y]--;
if (!d[y]) q.push(y);
}
}
if (tot==n)
{
D(i,n,1) printf("%d ",ans[i]);
printf("\n");
}
else printf("Impossible!\n");
}
}

bzoj4010【HNOI2015】菜肴制作的更多相关文章

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

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

  2. BZOJ4010: [HNOI2015]菜肴制作

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

  3. BZOJ4010[HNOI2015]菜肴制作——拓扑排序+堆

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

  4. BZOJ4010 [HNOI2015]菜肴制作 【拓扑排序 + 贪心】

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

  5. [BZOJ4010]:[HNOI2015]菜肴制作(拓扑排序)

    题目传送门 题目描述 知名美食家小A被邀请至ATM大酒店,为其品评菜肴. ATM酒店为小A准备了N道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间 ...

  6. bzoj4010: [HNOI2015]菜肴制作【拓扑排序】

    想到了一个分治方法,每一次尽量放小的那个,把它依赖的放在左边,不依赖的放在右边. TLE 80: #include <bits/stdc++.h> #define rep(i, a, b) ...

  7. bzoj4010: [HNOI2015]菜肴制作(拓扑排序+贪心+堆)

    这题不是求最小字典序...撕烤了半个小时才发现不对劲T T 这题是能让小的尽量前就尽量前,无论字典序...比如1能在2前面就一定要在2前面... 显然是要先拓扑排序,让小的尽量前转化成让大的尽量往后丢 ...

  8. BZOJ4010: [HNOI2015]菜肴制作(拓扑排序 贪心)

    题意 题目链接 Sol 震惊,HNOI竟出NOI原题 直接在反图上贪心一下. // luogu-judger-enable-o2 // luogu-judger-enable-o2 #include& ...

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

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

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

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

随机推荐

  1. webpack编译vue出现dev警告

    alias配置 vue < 2.1.0 module.exports = { ... resolve: { alias: { 'vue$': 'vue/dist/vue.js' } }, ... ...

  2. Codeforces Round #323 (Div. 2) A 水

    A. Asphalting Roads time limit per test 1 second memory limit per test 256 megabytes input standard ...

  3. Java EE 学习(1):什么是Java EE

    转载: http://www.jb51.net/article/13059.htm 经常听朋友说什么J2EE,终于知道点什么是J2EE了,汗一个,上网搜了下这个说的比较详细了,J2EE,Java2平台 ...

  4. HH去散步(bzoj 1875)

    Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因 ...

  5. HTTP 错误 401.2 - Unauthorized

    最近开始拾起Asp.net方面的知识,遇到如下这个问题 HTTP 错误 401.2 - Unauthorized 由于身份验证头无效,您无权查看此页. 解决方法: >IIS管理 >功能视图 ...

  6. 生成静态页面方法 .NET

    原文发布时间为:2009-09-30 -- 来源于本人的百度文章 [由搬家工具导入] 采用模板法:【例子中的两个页面以及生成的页面均在同一个目录,自己可以去改】 模板Template.htm: < ...

  7. Docker(三):Docker的基本概念

    Docker镜像: Docker镜像就是一个只读模板,例如,一个镜像可以包含Ubuntu操作系统环境,里面安装了Apache或用户需要的其它应用程序. 镜像可以用来创建Docker容器.Docker提 ...

  8. Vim查找替换及正则表达式的使用

    原文地址:http://tanqisen.github.io/blog/2013/01/13/vim-search-replace-regex/ 简单替换表达式 :[range]s/from/to/[ ...

  9. 在vscode中使用pylint-django插件解决pylint的一些不必要的错误提示【转】

    转自:http://www.cnblogs.com/chaojihexiang/p/6417835.html 微软的vscode编辑器是一个好东西,通过vscode编辑python程序非常的方便.推荐 ...

  10. C#图解教程学习笔记——方法

    一.字段和本地变量.本地常量字段:隶属于类的变量,即类的成员变量.本地变量:于保存本地的或临时的计算数据,即局部变量.本地常量:必须声明在块内部,声明时必须初始化,声明后不能改变.实例字段与本地变量区 ...