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」航空管制相关推荐

  1. BZOJ2535: [Noi2010]Plane 航空管制2(拓扑排序 贪心)

    题意 题目链接 Sol 非常妙的一道题. 首先不难想到拓扑排序,但是直接对原图按\(k\)从小到大拓扑排序是错的.因为当前的\(k\)大并不意味着后面的点\(k\)也大 但是在反图上按\(k\)从大到 ...

  2. React造轮子:拖拽排序组件「Dragact」

    先来一张图看看: 项目地址:Github地址 (无耻求星!) 在线观看(第一次加载需要等几秒):预览地址 说起来不容易,人在国外没有过年一说,但是毕竟也是中国年,虽然不放假,但是家里总会主内一顿丰盛的 ...

  3. bzoj 2109: [Noi2010]Plane 航空管制

    Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频 发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此, 小X表示很不满意. 在这次来烟台的 ...

  4. BZOJ2535 [Noi2010]Plane 航空管制 【贪心 + 堆】

    题目链接 BZOJ2535 题解 航班之间的关系形成了一个拓扑图 而且航班若要合法,应尽量早出发 所以我们逆拓扑序选点,能在后面出发的尽量后面出发,不会使其它点变得更劣,容易知是正确的 第二问只需枚举 ...

  5. BZOJ2535: [Noi2010]Plane 航空管制2

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2535 把图反向,拓扑排序一下,用并查集维护当前权值能放置的最大位置.对于第二问,就相当于我把点 ...

  6. bzoj 2535: [Noi2010]Plane 航空管制2【拓扑排序+堆】

    有个容易混的概念就是第一问的答案不是k[i]字典序最小即可,是要求k[i]大的尽量靠后,因为这里前面选的时候是对后面有影响的(比如两条链a->b c->d,ka=4,kb=2,kc=3,k ...

  7. 与卿共赴鸿蒙什么意思,『为君倾笑°‖笑红颜』「古风」唯美的古风句子,古风签必备!...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 126.无论多么落寂和苍茫 那些身影总会过目不忘 127.总在不经意的年生.回首彼岸.纵然发现光景绵长. 128.我总是在想,我的记忆是不是活在长街的那头 ...

  8. 揭开「拓扑排序」的神秘面纱

    作者 | 小齐本齐 责编 | Carol 来源 | 码农田小齐 Topological sort 又称 Topological order,这个名字有点迷惑性,因为拓扑排序并不是一个纯粹的排序算法,它 ...

  9. [NOI2010]航空管制(拓扑排序+贪心)

    题目描述 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上,小X不幸又一 ...

  10. 等比数列三角形 (数论 + 黄金分割点)+ JOISC 2016 Day3 T3 「电报」(基环树 + 拓扑排序)

    文章目录 T1:等比数列三角形 题目 题解 代码实现 T2:电报 题目 题解 代码实现 T1:等比数列三角形 题目 求三边都是 ≤n 的整数,且成等比数列的三角形个数 注意三角形面积不能为 0 注意 ...

最新文章

  1. Python print和pprint两者的区别
  2. jQuery如何创建元素
  3. java jdbc_详解Java基础知识——JDBC
  4. 浙江利捷分析报告(0612)
  5. 2021年必备procreate笔刷推荐下载
  6. 关于人工智能写作的发展以及看法
  7. 论文浅尝 | 探索用于归纳型知识图谱补全的关系语义
  8. adb填充安卓手机的内存
  9. apk系统签名小技巧
  10. 乐视汽车仅靠老贾的哽咽和激情是不够的
  11. 晟盾科技加入龙蜥社区,共建开源新生态
  12. 基于大数据的优质服务 微车将构建汽车互联网新生态
  13. 基于python下django框架 实现校园教室图书馆座位预约系统详细设计
  14. matlab在高等数学中的,matlab在高等数学中的应用
  15. 五、JS单线程运行原理与多线程
  16. 【仿真】基于模糊优化的PID直流无刷电机控制研究
  17. linux java jre下载_linux下安装jre运行环境
  18. c++gdal如何在大图像中截取小图像并获取其图像信息_盘点GAN在目标检测中的应用...
  19. 广州车展|埃安超跑Hyper GT登场,给年少有为者的时代献礼
  20. 3dmax渲染完就卡住不动怎么办?

热门文章

  1. tyvj P1179 飘飘乎居士数列游戏
  2. vue常用插件(一)
  3. 一种测试方法论RST(非广告)
  4. 增长黑客手册——02
  5. 自己实现ArrayList
  6. Microsoft Visual SourceSafe的使用
  7. 纸笔骑士2 android,荐游:一张纸笔就是一次中二冒险的开始!《骑士经理》评测...
  8. pmf源解析_科研进展 | 不同燃烧排放的一次有机物源谱特征及其在源解析中的应用...
  9. Unity 弹道轨迹
  10. 第1章 弗洛依德——精神分析