博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【HNOI2015】菜肴制作
阅读量:5050 次
发布时间:2019-06-12

本文共 1678 字,大约阅读时间需要 5 分钟。

题解

这道题目首先可以想到拓扑排序,但是肯定不是字典序最小的排列。

比如说,有\(4\)种菜,限制为\(2 \to 4, 3 \to 1\),那么如果求字典序最小的排列会算出\((2, 3, 1, 4)\),但是答案显然是\((3, 1, 2, 4)\)

于是,正难则反,发现如果最后一个数字在合法的范围内尽可能的大,那么就会更优。

我们就可以求字典序反序最大的排列。

于是建反图,跑拓扑排序即可,这里的拓扑排序要用到堆。

代码

#include
#include
#include
#include
#include
#define RG register#define file(x) freopen(#x".in", "r", stdin);freopen(#x".out", "w", stdout);#define clear(x, y) memset(x, y, sizeof(x))inline int read(){ int data = 0, w = 1; char ch = getchar(); while(ch != '-' && (!isdigit(ch))) ch = getchar(); if(ch == '-') w = -1, ch = getchar(); while(isdigit(ch)) data = data * 10 + (ch ^ 48), ch = getchar(); return data * w;}const int maxn(3e5 + 10);std::priority_queue
heap;struct edge { int next, to; } e[maxn];int head[maxn], e_num, n, m, deg[maxn], T, cnt, ans[maxn];inline void add_edge(int from, int to){ e[++e_num] = (edge) {head[from], to}; head[from] = e_num; ++deg[to];}int main(){ T = read(); while(T--) { clear(head, 0); e_num = 0; clear(deg, 0); n = read(); m = read(); int f = 0; cnt = 0; for(RG int i = 1, x, y; i <= m; i++) { x = read(), y = read(), add_edge(y, x); if(x == y) f = 1; } if(f) { puts("Impossible!"); continue; } for(RG int i = 1; i <= n; i++) if(!deg[i]) heap.push(i); while(!heap.empty()) { int x = heap.top(); heap.pop(); ans[++cnt] = x; for(RG int i = head[x]; i; i = e[i].next) { int to = e[i].to; if(!(--deg[to])) heap.push(to); } } if(cnt < n) puts("Impossible!"); else { for(RG int i = n; i; i--) printf("%d ", ans[i]); puts(""); } } return 0;}

转载于:https://www.cnblogs.com/cj-xxz/p/10411356.html

你可能感兴趣的文章
linux调度器系列
查看>>
mysqladmin
查看>>
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
SVN服务器搭建和使用(三)(转载)
查看>>
Android 自定义View (三) 圆环交替 等待效果
查看>>
设置虚拟机虚拟机中fedora上网配置-bridge连接方式(图解)
查看>>
HEVC播放器出炉,迅雷看看支持H.265
查看>>
[置顶] Android仿人人客户端(v5.7.1)——人人授权访问界面
查看>>
Eclipse 调试的时候Tomcat报错启动不了
查看>>
【安卓5】高级控件——拖动条SeekBar
查看>>
ES6内置方法find 和 filter的区别在哪
查看>>
Android入门之文件系统操作(二)文件操作相关指令
查看>>
Android实现 ScrollView + ListView无滚动条滚动
查看>>
Swift 中的指针使用
查看>>
Swift - 使用闭包筛选过滤数据元素
查看>>
alue of type java.lang.String cannot be converted to JSONObject
查看>>
搜索引擎选择: Elasticsearch与Solr
查看>>
JAVA设计模式之简单工厂模式与工厂方法模式
查看>>
③面向对象程序设计——封装
查看>>
【19】AngularJS 应用
查看>>