『拓扑排序』「NOI2010」航空管制
Problem\mathrm{Problem}Problem
世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生。最近,小X就因为航空管制,连续两次在机场被延误超过了两小时。对此,小X表示很不满意。
在这次来烟台的路上,小X不幸又一次碰上了航空管制。于是小X开始思考关于航空管制的问题。
假设目前被延误航班共有n个,编号为1至n。机场只有一条起飞跑道,所有的航班需按某个顺序依次起飞(称这个顺序为起飞序列)。定义一个航班的起飞序号为该航班在起飞序列中的位置,即是第几个起飞的航班。
起飞序列还存在两类限制条件:
• 第一类(最晚起飞时间限制):编号为i的航班起飞序号不得超过ki;
• 第二类(相对起飞顺序限制):存在一些相对起飞顺序限制(a, b),表示航班a的起飞时间必须早于航班b,即航班a的起飞序号必须小于航班b的起飞序号。
小X思考的第一个问题是,若给定以上两类限制条件,是否可以计算出一个可行的起飞序列。第二个问题则是,在考虑两类限制条件的情况下,如何求出每个航班在所有可行的起飞序列中的最小起飞序号。
Solution\mathrm{Solution}Solution
显然我们可以根据第二类限制建立有向无环图,进行拓扑排序。
考虑第一种限制,对于某一个节点 xxx 设位置为 p(p≤kx)p(p\le k_x)p(p≤kx),我们要求最大化 ppp。
观察到如果我们直接做,当某一个ppp可以放进某一位置时,由于你的策略是最大化 ppp,若你此时不放可能存在后面放不进去的情况,那么这么你就很难对此进行贪心。
但是若题目将 ≤≤≤ 的限制改为 ≥≥≥,你会发现:
- 若某一时刻 ppp 满足条件,那么无论后面无论如何操作,ppp 永远都是合法的。
因此,我们可以反向建图(因此答案也要反向输出),编号为 iii 的位置需要 ≥n−ki+1\ge n-k_i+1≥n−ki+1。
考虑第一问输出一种合法方案:
- 显然对于进入队列的点,n−ki+1n-k_i+1n−ki+1点可以满足,那么这个数值比它大的点同样能满足。因此我们每一次选取n−ki+1n-k_i+1n−ki+1最小的点取出队列,直接存储答案即可。
对于第二问:
- 我们队列的做法也和第一问一样,只是我们强制让某一个点不进入队列,判断其它最多有几个点能够进入队列。那么假设有 ttt 个点进入队列,当前点的位置即为t+1t+1t+1。
Code\mathrm{Code}Code
#include <bits/stdc++.h>using namespace std;
const int N = 2e5;int n, m, cnt(0);
int in[N], c[N], res[N], t[N];
vector < int > a[N];int read(void)
{int s = 0, w = 0; char c = getchar();while (!isdigit(c)) w |= c == '-', c = getchar();while (isdigit(c)) s = s*10+c-48, c = getchar();return w ? -s : s;
}void Topsort1(void)
{priority_queue < pair<int,int> > q;for (int i=1;i<=n;++i) c[i] = in[i];for (int i=1;i<=n;++i)if (c[i] == 0) q.push({-(n - t[i]), i});while (q.size()){int x = q.top().second; q.pop();res[++ cnt] = x; for (int i=0;i<a[x].size();++i){int y = a[x][i];c[y] --;if (c[y] == 0) q.push({-(n - t[y]), y});}}for (int i=cnt;i>=1;--i) printf("%d ", res[i]);puts("");return;
}int topsort2(int root)
{int tot = 0;priority_queue < pair<int,int> > q;for (int i=1;i<=n;++i) c[i] = in[i];for (int i=1;i<=n;++i) if (in[i] == 0) q.push({-(n - t[i]), i});while (q.size()){int x = q.top().second; q.pop();if (x == root) continue;if (n - tot > t[x]) return tot;tot ++;for (int i=0;i<a[x].size();++i){int y = a[x][i]; c[y] --;if (c[y] == 0) q.push({-(n - t[y]), y});}}return tot;
}int main(void)
{n = read(), m = read();for (int i=1;i<=n;++i) t[i] = read();for (int i=1;i<=m;++i){int x = read(), y = read();a[y].push_back(x), in[x] ++;}Topsort1();for (int i=1;i<=n;++i) printf("%d ", n - topsort2(i));return 0;
}
『拓扑排序』「NOI2010」航空管制相关推荐
- BZOJ2535: [Noi2010]Plane 航空管制2(拓扑排序 贪心)
题意 题目链接 Sol 非常妙的一道题. 首先不难想到拓扑排序,但是直接对原图按\(k\)从小到大拓扑排序是错的.因为当前的\(k\)大并不意味着后面的点\(k\)也大 但是在反图上按\(k\)从大到 ...
- React造轮子:拖拽排序组件「Dragact」
先来一张图看看: 项目地址:Github地址 (无耻求星!) 在线观看(第一次加载需要等几秒):预览地址 说起来不容易,人在国外没有过年一说,但是毕竟也是中国年,虽然不放假,但是家里总会主内一顿丰盛的 ...
- bzoj 2109: [Noi2010]Plane 航空管制
Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频 发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此, 小X表示很不满意. 在这次来烟台的 ...
- BZOJ2535 [Noi2010]Plane 航空管制 【贪心 + 堆】
题目链接 BZOJ2535 题解 航班之间的关系形成了一个拓扑图 而且航班若要合法,应尽量早出发 所以我们逆拓扑序选点,能在后面出发的尽量后面出发,不会使其它点变得更劣,容易知是正确的 第二问只需枚举 ...
- BZOJ2535: [Noi2010]Plane 航空管制2
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2535 把图反向,拓扑排序一下,用并查集维护当前权值能放置的最大位置.对于第二问,就相当于我把点 ...
- bzoj 2535: [Noi2010]Plane 航空管制2【拓扑排序+堆】
有个容易混的概念就是第一问的答案不是k[i]字典序最小即可,是要求k[i]大的尽量靠后,因为这里前面选的时候是对后面有影响的(比如两条链a->b c->d,ka=4,kb=2,kc=3,k ...
- 与卿共赴鸿蒙什么意思,『为君倾笑°‖笑红颜』「古风」唯美的古风句子,古风签必备!...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 126.无论多么落寂和苍茫 那些身影总会过目不忘 127.总在不经意的年生.回首彼岸.纵然发现光景绵长. 128.我总是在想,我的记忆是不是活在长街的那头 ...
- 揭开「拓扑排序」的神秘面纱
作者 | 小齐本齐 责编 | Carol 来源 | 码农田小齐 Topological sort 又称 Topological order,这个名字有点迷惑性,因为拓扑排序并不是一个纯粹的排序算法,它 ...
- [NOI2010]航空管制(拓扑排序+贪心)
题目描述 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上,小X不幸又一 ...
- 等比数列三角形 (数论 + 黄金分割点)+ JOISC 2016 Day3 T3 「电报」(基环树 + 拓扑排序)
文章目录 T1:等比数列三角形 题目 题解 代码实现 T2:电报 题目 题解 代码实现 T1:等比数列三角形 题目 求三边都是 ≤n 的整数,且成等比数列的三角形个数 注意三角形面积不能为 0 注意 ...
最新文章
- Python print和pprint两者的区别
- jQuery如何创建元素
- java jdbc_详解Java基础知识——JDBC
- 浙江利捷分析报告(0612)
- 2021年必备procreate笔刷推荐下载
- 关于人工智能写作的发展以及看法
- 论文浅尝 | 探索用于归纳型知识图谱补全的关系语义
- adb填充安卓手机的内存
- apk系统签名小技巧
- 乐视汽车仅靠老贾的哽咽和激情是不够的
- 晟盾科技加入龙蜥社区,共建开源新生态
- 基于大数据的优质服务 微车将构建汽车互联网新生态
- 基于python下django框架 实现校园教室图书馆座位预约系统详细设计
- matlab在高等数学中的,matlab在高等数学中的应用
- 五、JS单线程运行原理与多线程
- 【仿真】基于模糊优化的PID直流无刷电机控制研究
- linux java jre下载_linux下安装jre运行环境
- c++gdal如何在大图像中截取小图像并获取其图像信息_盘点GAN在目标检测中的应用...
- 广州车展|埃安超跑Hyper GT登场,给年少有为者的时代献礼
- 3dmax渲染完就卡住不动怎么办?