P3243 [HNOI2015]菜肴制作(思维 + 拓扑排序+反图)
创始人
2025-05-30 15:17:07

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

由于菜肴之间口味搭配的问题,某些菜肴必须在另一些菜肴之前制作,具体的,一共有 m 条形如 i 号菜肴必须先于 jj 号菜肴制作的限制,我们将这样的限制简写为 (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 号又应尽量比 44 号优先,所以当前可确定前三道菜的制作顺序是 3,4,13,4,1;接下来考虑 22,确定最终的制作顺序是 3,4,1,23,4,1,2。

例 2 里,首先制作 1是不违背限制的;接下来考虑 2 时有 (5,2) 的限制,所以接下来先制作 5 再制作 2;接下来考虑 33 时有 (4,3)(4,3) 的限制,所以接下来先制作 44 再制作 33,从而最终的顺序是 1,5,2,4,31,5,2,4,3。现在你需要求出这个最优的菜肴制作顺序。无解输出 Impossible!(首字母大写,其余字母小写)

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

输出格式
输出文件仅包含 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

解析:

最佳的序列并不是最小字典序。有第3个样例可以知道。

如果用一个小根堆来维护拓扑的话显然是会不行的,因为这样求出来的是字典序最小的拓扑序,并不一定是1尽可能在前

因为字典序是贪心的,如果前面的一位能小就尽可能的小,并不保证1出现尽量靠前

但是如果建一个反图,求一个反向字典序最大的拓扑序呢

那么就会有大的数尽量靠前的情况出现,于是交小的数尽量靠后,于是反过来就是小的数尽量靠前了

于是反着建图+一个大根堆维护就好了

#include
using namespace std;
const int MAX = 100010;
struct edge {int v, next;
}e[MAX];
int d, n, m, in[MAX], cnt, head[MAX], a[MAX];
priority_queue q; //默认大根堆
inline int read() {int x = 0, f = 1;char c = getchar();while (c < '0' || c>'9') {if (c == '-') {f = -1;}c = getchar();}while (c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + c - '0';c = getchar();}return x * f;
}
void add(int u, int v) {e[++cnt].v = v;e[cnt].next = head[u];head[u] = cnt;
}
int bfs() {while (!q.empty()) {int p = q.top();q.pop();cnt++;a[cnt] = p;for (int i = head[p]; i > 0; i = e[i].next) {int v = e[i].v;in[v]--;if (!in[v]) {q.push(v);}}}return cnt == n;//没有环
}
int main() {d = read();while (d--) {memset(in, 0, sizeof(in));memset(head, 0, sizeof(head));cnt = 0;n = read(), m = read();for (int i = 1; i <= m; i++) {int x, y;x = read(), y = read();add(y, x); // 反向边in[x]++;}for (int i = 1; i <= n; i++) {if (!in[i]) {q.push(i);}}cnt = 0;if (bfs()) {for (int i = n; i >= 1; i--) {printf("%d ", a[i]);}printf("\n");}else {printf("Impossible!\n");}}return 0;
}

相关内容

热门资讯

下周279亿元限售股解禁,这三... 6月2日-6月8日(下周),迎来限售股解禁的A股企业数量较本周减少3家,解禁总市值更高,仍然没有解禁...
App 性能测试关注点 一、 App 性能指标 App 性能问题如 app 使用时卡顿严重或者加载页面慢,c...
Python 中错误 Synt... 文章目录重写错误发生的行导致错误的字符可能是不可见的另一个错误发生的例子确保我们的键盘设置为正确的语...
妖魔化车企高负债,是杞人忧天的... 撰文丨鹿羽近期,车企负债问题引起广泛热议。比亚迪集团品牌及公关处总经理李云飞发文回应,其从资产负债率...
曼联5000万镑豪购奇招!神秘... 曼联5000万镑豪购奇招!神秘前队友密谋,姆贝乌莫驾临梦剧场? 老特拉福德的夏窗还没正式开启,空气中...
【Leetcode】队列实现栈...      目录 一.【Leetcode225】队列实现栈 1.链接 2.题目再现  3.解法 二.【...
Kaggle实战入门:泰坦尼克... Kaggle实战入门:泰坦尼克号生还预测1. 加载数据2. 特征工程3. 模型训练4....
【Tomcat内核】serve... 以下回答来自chatGPT server是什么? Server可以翻译为服务器&#x...
广州美妆新势力,正在横扫东南亚... 记者丨赖镇桃 编辑丨和佳 陈晓平Henry在美妆品牌Colorkey国际部工作,他第一次到越南,是去...
【国产FPGA】国产FPGA搭... 最近收到了高云寄过来的FPGA板卡,下图:来源:https...
Linux下KingbaseE... 一、备份方式 KingbaseESV8数据库备份的两种方式: (1&#x...
Fastapi学习笔记之使用 ... 前言我写了一个关于 FastAPI 的简单教程,它是关于简化和理解 API 的工作原理...
法网|冲击八强!女单第四轮,郑... 齐鲁晚报·齐鲁壹点 怀晓 郑钦文将向八强席位发起冲击。新华社发 连下3场击败帕芙柳琴科娃、阿朗戈和...
“工作三年,跳槽要求涨薪50%... 如果问在TI行业涨工资最快的方式是什么?回答最多的一定是:跳槽ÿ...
业绩承压,中信重工募投项目延期... 5月30日晚间,中信重工(601608)发布公告称,公司召开第六届董事会第十三次会议,审议通过了《关...
财联社创投通:一级市场本周90... 《科创板日报》5月31日讯据财联社创投通数据显示,本周(5.24-5.30)国内统计口径内共发生90...
【投融资动态】汉硅半导体A+轮... 证券之星消息,根据天眼查APP于5月27日公布的信息整理,辽宁汉硅半导体材料有限公司A+轮融资,融资...
Linux 线程同步 文章目录一、线程同步介绍同步与互斥概述线程同步问题二、互斥锁为什么需要互斥锁互斥锁 Mutex 介绍...
可以谈一谈动态扩容缩容的分库分... 如何设计可以动态扩容缩容的分库分表方案? 面试官心理分析 对于分库分表来说,主要是面对以下问题: 选...
MySQL能干大部分事,为什么... 因为需要背锅侠?先来看一个真实案例。 某年某央企千万级用户百亿金额的上古系统ÿ...
利用两个队列(单链表模拟)实现... 利用队列实现栈数据结构225. 用队列实现栈 - 力扣(LeetCode)...
STM32之震动传感器、继电器... 目录 一、震动传感器介绍及实战 二、编程代码实现 1、gpio.c---------初始化GPIO口...
宝武钢铁集团迎来新任总会计师 ... 中国宝武钢铁集团有限公司(以下简称“宝武钢铁集团”)官网近日更新信息显示,李丽娜已于2025年5月起...
【java刷题】排序子序列 这里写目录标题问题描述解决思路实现代码 问题描述 牛牛定义排序子序列为一个数组中一段连续的子序列,并...
mysql-interview 隔离级别有哪几种,分别解决什么问题为什么mysql 默认隔离级别是rr,...
全球资金从美国回流新兴市场 全... 参考消息网5月31日报道 据《日本经济新闻》5月27日报道,全球资金开始再次流入新兴市场国家。从流入...
银河麒麟v10系统硬盘挂载并配... 一、查看磁盘 近期由于centos系统停止更新用户服务器要更换银河麒麟v10,拿到服务...
Leetcode刷题之经典双指...         光是话不行,要紧的是做。                       ...
京东美团外卖大战的底层逻辑是什... 原文标题:《京东美团外卖大战的深度分析》,题图来自:视觉中国 京东最近强势进军外卖行业与美团进行了激...