题目描述:

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

由于菜肴之间口味搭配的问题,某些菜肴必须在另一些菜肴之前制作,具体的,一共有 m 条形如 iii 号菜肴必须先于 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 是不违背限制的;接下来考虑 222 时有 (5,2) 的限制,所以接下来先制作 5 再制作 2;接下来考虑 3 时有 (4,3) 的限制,所以接下来先制作 4 再制作 3,从而最终的顺序是 1,5,2,4,3。现在你需要求出这个最优的菜肴制作顺序。无解输出 Impossible!(首字母大写,其余字母小写)

输入格式

第一行是一个正整数 t,表示数据组数。接下来是 ttt 组数据。对于每组数据:第一行两个用空格分开的正整数 n 和 m,分别表示菜肴数目和制作顺序限制的条目数。接下来 m 行,每行两个正整数 x,y,表示 x 号菜肴必须先于 y 号菜肴制作的限制。

输出格式

输出文件仅包含 t 行,每行 n 个整数,表示最优的菜肴制作顺序,或者 Impossible! 表示无解。

输入输出样例

输入 #1

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

输出 #1

1 5 3 4 2 Impossible! 1 5 2 4 3

说明/提示

【样例解释】

第二组数据同时要求菜肴 1 先于菜肴 2 制作,菜肴 2 先于菜肴 3 制作,菜肴 3 先于。

菜肴 1 制作,而这是无论如何也不可能满足的,从而导致无解。

【数据范围】

100%的数据满足 n,m≤1e5,1≤t≤3。

m 条限制中可能存在完全相同的限制。

首先建图看一下:

我们可以发现规律:从上向下走,如果看成BFS,就是每次选取一层(小-->大排序,就是该层选取的最优解) 【请接着看,这个只是当时的猜测】

5 3 4 2

再看一个样例:

1 5 2 4 3

到这里,似乎可以发现是拓扑排序了!!!

那就解决80%了!

再看个样例:

发现:如果成环就输出 :

Impossible!

这也不难理解,因为成环无法 拓扑排序

思路:

因为题意是让我们优先找最小的

所以我们 可以存反图 + 优先队列(大根堆)

最后倒序输出就可以了

AC代码如下:

#include <bits/stdc++.h>
#define ll long long
#define buff                     \ios::sync_with_stdio(false); \cin.tie(0);                  \cout.tie(0);
#define endl "\n"
using namespace std;
const int N = 1e5 + 9;
int e[N], ne[N], h[N], idx;
int d[N];
int tuop[N], cnt;
int n, m;
priority_queue<int> q; //大根堆
void add(int a, int b)
{e[idx] = b;ne[idx] = h[a];h[a] = idx++;
}
void clea()
{// memset(e,0,sizeof e);// memset(ne,0,sizeof ne);// memset(h,0,sizeof h);idx = 0;// while (!q.empty())// {//     q.pop();// }
}
bool tuopsort()
{while (!q.empty()){int t = q.top();tuop[++cnt] = t;q.pop();for (int i = h[t]; i != -1; i = ne[i]){int j = e[i];d[j]--;if (d[j] == 0)q.push(j);}}if (cnt == n)return 1;elsereturn 0;
}
void solve()
{clea();cin >> n >> m;cnt = 0;memset(h, -1, sizeof h);memset(d, 0, sizeof d);for (int i = 1; i <= m; i++){int a, b;cin >> a >> b;add(b, a); //存反图d[a]++;}for (int i = 1; i <= n; i++){if (d[i] == 0)q.push(i);}if (tuopsort() == 0){cout << "Impossible!" << endl;}else{// cout<<"********"<<endl;for (int i = cnt; i >= 1; i--){cout << tuop[i] << ' ';}cout << endl;}
}
int main()
{buff int t;cin >> t;while (t--)solve();
}

P3243 [HNOI2015]菜肴制作(拓扑 + 优先队列)相关推荐

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

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

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

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

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

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

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

    4010: [HNOI2015]菜肴制作 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...

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

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

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

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

  7. P3243 [HNOI2015]菜肴制作(拓扑排序、贪心)

    解析 很好的题 也就是我没做出来的意思 反向思维似乎是我欠缺的 这道题也是 也许做题时应该多特意往这边想想 当正向看并没有太好的性质时,也许反过来能使题目豁然开朗 容易想到暴力n方如何做 (以下均指反 ...

  8. 洛谷:P3243 [HNOI2015]菜肴制作(拓扑序列、建反图、贪心)

    美食家老嗨 题意: 很容易读偏,以为是求满足限制下的最小字典序. 要求是在满足所有限制后,优先做 1,此外优先做 2 - -- 摘自xyz32768 C o d e : Code: Code: #in ...

  9. P3243 [HNOI2015]菜肴制作

    传送门 把时间看成数,菜肴看成位置 考虑一个位置填什么数很麻烦 考虑一个数放在什么位置 一开始我想的是,对于一个限制 $(a,b)$ ,从 $a$ 往 $b$ 连一条边,然后如果有解则所有的限制构成了 ...

最新文章

  1. 微信小程序打开PDF
  2. 最短路径算法(一) Dijkstra算法(贪心算法)
  3. java des加密解密
  4. 清除nginx服务器网站缓存数据
  5. AMD深度学习库MIOpen更新,支持CNN加速
  6. IPSec之security acl
  7. C#中判断字符是否为中文
  8. h5侠客行服务器维护有更新什么,《侠客行》1月22日版本更新说明
  9. 字体转换,woff,ttf,otf,eot,svg
  10. 高并发大流量解决方案
  11. 左程云算法 哈希函数
  12. inssider序列号_AP注册问题-华三.ppt
  13. 【计算机网络 (谢希仁) 习题题解】第5章 运输层 (5)——TCP的运输连接管理
  14. BCM业务连续性管理
  15. Android自定义View,仿QQ显示用户等级
  16. Go优雅的重启服务之endless库
  17. linux夏令时配置文件,Linux中有关时区及夏令时设置(TZ环境变量)
  18. mysql允许远程链接,开放3306端口
  19. 谷歌浏览器倍速播放视频方法
  20. Java XML分析技术: StAX, SAX, DOM, DOM4j, JDOM

热门文章

  1. BGP—— Confederation联邦(讲解+配置)
  2. @vail 判断某字段在范围内_怎么判断一台二次元影像测量仪的可靠性?
  3. SpringMVC 解决中文乱码的过滤器
  4. 【C语言】创建一个函数,利用该函数将两个字符串连接起来
  5. xamarin_如何实现声明性Xamarin表单验证
  6. 构建meteor应用程序_我构建了一个渐进式Web应用程序并将其发布在3个应用程序商店中。 这是我学到的。...
  7. scrum master_从Scrum Master到工程副总裁:职称为何重要
  8. Ubuntu上 anaconda的卸载
  9. golang配置环境排坑
  10. Python错误,pip安装包或更新时因超时而报错误