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. js确保正确this的几种写法

    1.直接用bind调用 this.method.bind(this) 2.构造函数中用bind定义 class Foo{ constructor(){ this.method = this.metho ...

  2. 设置pycharm的python版本

    http://blog.csdn.net/github_35160620/article/details/52486986

  3. 思维导图工具 & 原型设计工具

    最近需要画出系统流程架构什么的,就用到了几个思维导图工具 1. XMind -- 思维导图工具 2. MindManager -- 思维导图工具 3. AXURE RP --原型设计工具

  4. [AGC003F] Fraction of Fractal(矩阵乘法)

    Description Snuke从他的母亲那里得到了生日礼物--一个网格.网格有H行W列.每个单元格都是黑色或白色.所有黑色单元格都是四联通的,也就是说,只做水平或垂直移动且只经过黑色单元格即可从任 ...

  5. URAL1960 Palindromes and Super Abilities

    After solving seven problems on Timus Online Judge with a word “palindrome” in the problem name, Mis ...

  6. 先将Excel导入到gridview再添加进数据库【Excel批量添加】

    原文发布时间为:2008-10-27 -- 来源于本人的百度文章 [由搬家工具导入] 前台: <%@ Page Language="C#" AutoEventWireup=& ...

  7. LeetCode总结【转】

    转自:http://blog.csdn.net/lanxu_yy/article/details/17848219 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近完成了www.leetco ...

  8. Push pull, open drain circuit, pull up, pull down resistor

    Push pull 就以下面這個 電路來說, 因為沒有 pull up resistor, 所以 output voltage 由 low 往 high 的速度會較快. 有兩個電晶體,一個on,一個 ...

  9. [转]iOS8 自动调整UITableView和UICollectionView布局

    转自:http://www.cocoachina.com/industry/20140825/9450.html (via:玉令天下的Blog)   本文讲述了UITableView.UICollec ...

  10. [MySQL] xtrabakcup原理

    Xtrabackup InnoDB内部的Redo log, 也叫Transaction log file. 存储每一个InnoDB表纪录的修改日志. 当InnoDB启动时, InnoDB会检查数据文件 ...