4010: [HNOI2015]菜肴制作

Time Limit: 20 Sec  Memory Limit: 256 MB

题目连接

http://www.lydsy.com/JudgeOnline/problem.php?id=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 号和 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

题意

题解:

拓扑排序问题,反向建图,由于他要输出一个字典序,注意不是字典序,注意不是字典序,注意不是字典序

序号小的在前面的图,那么我们就用优先队列优化一下就好了

代码:

//qscqesze
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define maxn 200001
#define mod 10007
#define eps 1e-9
int Num;
char CH[20];
//const int inf=0x7fffffff;   //нчоч╢С
const int inf=0x3f3f3f3f;
/*inline void P(int x)
{Num=0;if(!x){putchar('0');puts("");return;}while(x>0)CH[++Num]=x%10,x/=10;while(Num)putchar(CH[Num--]+48);puts("");
}
*/
inline ll read()
{ll 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 P(int x)
{Num=0;if(!x){putchar('0');puts("");return;}while(x>0)CH[++Num]=x%10,x/=10;while(Num)putchar(CH[Num--]+48);puts("");
}
//**************************************************************************************int head[maxn];
int top;
int d[maxn];
priority_queue<int>q;
struct edge
{int v,next;
}e[maxn];
int cnt;
int ans[maxn];
int n,m;
void insert(int u,int v)
{e[cnt].v=v;e[cnt].next=head[u];head[u]=cnt;cnt++;
}void solve(int x)
{q.pop();ans[++top]=x;for(int i=head[x];i>=0;i=e[i].next){d[e[i].v]--;if(d[e[i].v]==0)q.push(e[i].v);}
}int main()
{//freopen("test.txt","r",stdin);int t=read();while(t--){n=read(),m=read();cnt=top=0;memset(head,-1,sizeof(head));memset(d,0,sizeof(d));for(int i=1;i<=m;i++){int u=read(),v=read();insert(v,u);d[u]++;}for(int i=1;i<=n;i++)if(!d[i])q.push(i);while(!q.empty()){solve(q.top());}if(top!=n)printf("Impossible!\n");else{for(int i=n;i;i--)printf("%d ",ans[i]);printf("\n");}}return 0;
}

bzoj 4010: [HNOI2015]菜肴制作 拓扑排序相关推荐

  1. 【luoguP3243】[HNOI2015]菜肴制作--拓扑排序

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

  2. 洛谷P3243 [HNOI2015]菜肴制作——拓扑排序

    题目:https://www.luogu.org/problemnew/show/P3243 正向按字典序拓扑排序很容易发现是不对的,因为并不是序号小的一定先做: 但若让序号大的尽可能放在后面,则不会 ...

  3. B4010 菜肴制作 拓扑排序(附随机跳题代码)

    今天写了一个自己的随机跳题小程序,第一次试发现跳的全是不可做题,但是在周围我一眼看见了这个题,不能说一眼看出来,但是也是比较有思路,所以就做他了! 做得比较顺利,做完之后美滋滋,突然发现样例第三组过不 ...

  4. 【BZOJ 4010】 [HNOI2015]菜肴制作

    4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB Submit: 426 Solved: 242 [Submit][Status] ...

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

    P3243 [HNOI2015]菜肴制作 题目误导你正着做拓扑排序,然鹅你可以手造数据推翻它.于是就只能倒着做 我们开个优先队列,每次把可填的最大的编号取出来搞,最后倒着输出拓扑序就好辣 #inclu ...

  6. P3243 [HNOI2015]菜肴制作 (拓扑排序)

    [HNOI2015]菜肴制作 - 洛谷 建反图跑字典序最大top_sort即可. /*keep on going and never give up*/ #include<bits/stdc++ ...

  7. 刷题记录(NC20115 [HNOI2015]菜肴制作)

    NC20115 [HNOI2015]菜肴制作 题目链接 关键点: 1.题目要求在给定某些菜品的先后顺序下,并且满足号小的尽量在前的最优顺序 2.对于某些菜品有先后顺序,这就很容易想到拓扑排序,对于有先 ...

  8. P3243 [HNOI2015]菜肴制作(拓扑 + 优先队列)

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

  9. 洛谷P3243 [HNOI2015]菜肴制作(思维+反向拓扑)

    传送门 听说原本是紫题 需要先做 i i i 再做 j j j 的限制很自然的让人想到了拓扑排序,然而让编号较小的菜肴尽可能较早输出并不是要求得到最小字典序的答案!! 反面样例可见第三组输入数据,若按 ...

最新文章

  1. 人人都能看懂的LSTM
  2. 雅特力415开发资料_雅特力在车用电子领域 AT32 MCU应用于ADAS环视系统
  3. Linux的文本字段统计方法
  4. 计数信号量的删除与状态查询
  5. [java] javax.el.PropertyNotFoundException: Property 'id' not found on type bean.Student
  6. Spring IOC-BeanFactory的继承体系结构
  7. 两层卷积网络实现手写数字的识别(基于tensorflow)
  8. Django REST Framework API Guide 07
  9. 刚刚,四位平民上天了!
  10. 数据库(表结构和数据) 保存为 *.sql文件
  11. Linux基础知识笔记
  12. HttpClient中post请求http、https示例
  13. 全国计算机二级公共基础知识电子版,全国计算机二级公共基础知识汇总.pdf
  14. 无悔追梦人 追梦五年
  15. ★ Android 各类依赖库文件 收藏 ★
  16. 202011.22深圳湾渐变晚霞-莫安迪原创摄影作品
  17. py2exe 打包 Pmw Error 3 解决方案
  18. 东北大学和西南大学计算机,东北大学、东南大学、中南大学、西南大学、西北大学,哪个最好?...
  19. teradata 查看 表定义_Teradata表类型
  20. 茅山煤矿轶事(三)--拖拉机

热门文章

  1. mysql三高讲解(二):2.3 InnoDB索引即数据
  2. C++安全方向(三)3.4 使用哈希列表验证文件的完整性
  3. 3500x架构_如何评价超威半导体(AMD)新发布的 锐龙(Ryzen)3500X?
  4. mysql更新数据库中int 1_Mysql数据库int(1)和tinyint(1)的区别扩展阅读
  5. jquery查找父窗体id_js/jquery如何获取父窗口的元素?
  6. 爬取亚马逊评论_如何利用插件抓取亚马逊评论和关键词?
  7. python执行脚本时的命令行选项_Python 处理脚本的命令行参数(二):使用click
  8. java 如何去掉 nbsp_java-如何去掉JFrame上的最大化最小化和关闭按钮
  9. 太吾绘卷第一世攻略_育劳 | 花菜小当家,巧克力蛋糕卷的出道秘籍
  10. signature php今日头条,今日头条_signature 求解