【[NOI2010]航空管制】
关于拓扑排序的反建图还是一个非常套路的东西
我们希望使得某一个东西在拓扑序中出现的尽可能早,这个时候就可以建出一张反图来,使得这个东西在反图中的拓扑序尽量靠后,从而使得其出现的尽可能地早
这是为什么呢,比如说我们希望\(1\)出现的尽可能早,直接在正图上开一个小根堆来进行拓扑排序显然错的
为什么呢,因为这样只能使字典序尽可能小,而不是使得\(1\)尽可能靠前
但是我们建出反图来呢,显然反图上按照上述方法来跑的话会使得反向字典序最小,而最小的反向字典序一定是\(1\)最靠后的
这道题可以建出一个反图来,从而使得限制条件变成了每一个航班在拓扑序中的位置\(>n-k[i]\),于是我们直接用小根堆来维护\(n-k[i]\)就好了
至于第二问,在每一个点入度为\(0\)可以进堆的时候,我们先不让它进去,而是等某一个元素不满足条件的时候,这个时候就是应该进堆了
代码
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#define re register
#define mp std::make_pair
#define maxn 2005
struct E
{
int v,nxt;
}e[10005];
int head[maxn],r[maxn],d[maxn];
int c[maxn];
int ans[maxn],tot;
int n,m,num;
typedef std::pair<int,int> pii;
std::priority_queue<pii,std::vector<pii>,std::greater<pii> > q;
inline void add_edge(int x,int y)
{
e[++num].v=y;
e[num].nxt=head[x];
head[x]=num;
}
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
inline int work(int x)
{
tot=0;
while(!q.empty()) q.pop();
for(re int i=1;i<=n;i++) r[i]=c[i];
for(re int i=1;i<=n;i++)
if(!r[i]) q.push(mp(n-d[i],i));
while(!q.empty())
{
int k=q.top().second;
q.pop();
if(k==x) continue;
if(n-tot>d[k]) return n-tot;
tot++;
for(re int i=head[k];i;i=e[i].nxt)
{
r[e[i].v]--;
if(!r[e[i].v]) q.push(mp(n-d[e[i].v],e[i].v));
}
}
return n-tot;
}
int main()
{
n=read(),m=read();
for(re int i=1;i<=n;i++)
d[i]=read();
int x,y;
for(re int i=1;i<=m;i++)
x=read(),y=read(),add_edge(y,x),r[x]++;
for(re int i=1;i<=n;i++) c[i]=r[i];
for(re int i=1;i<=n;i++)
if(!r[i]) q.push(mp(n-d[i],i));
while(!q.empty())
{
int k=q.top().second;
q.pop();
ans[++tot]=k;
for(re int i=head[k];i;i=e[i].nxt)
{
r[e[i].v]--;
if(!r[e[i].v]) q.push(mp(n-d[e[i].v],e[i].v));
}
}
for(re int i=n;i;i--)
printf("%d ",ans[i]);
puts("");
for(re int i=1;i<=n;i++)
printf("%d ",work(i));
return 0;
}
【[NOI2010]航空管制】的更多相关文章
- NOI2010航空管制
2008: [Noi2010]航空管制 Time Limit: 10 Sec Memory Limit: 552 MBSubmit: 31 Solved: 0[Submit][Status] De ...
- [BZOJ2109][NOI2010]航空管制(贪心+拓扑)
2109: [Noi2010]Plane 航空管制 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1227 Solved: 510[Submit][ ...
- bzoj2535 [Noi2010]航空管制
Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上 ...
- [NOI2010]航空管制(拓扑排序+贪心)
题目描述 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上,小X不幸又一 ...
- NOI2010 航空管制
http://www.lydsy.com/JudgeOnline/problem.php?id=2535 贪心. 对于第1个问,我们先建立拓扑图,对于如果a必须在b前起飞,那么连有向边b->a, ...
- BZOJ.2109.[NOI2010]航空管制(拓扑 贪心)
题目链接 双倍经验(没有第一问) \(Description\) \(Solution\) 第一问拓扑排序即可. 第二问,即让一个元素在拓扑序中尽量靠前,好像不好做. 但是可以让一个元素出现尽量靠后. ...
- 洛谷 P1954 [NOI2010]航空管制
https://www.luogu.org/problemnew/show/P1954 拓扑排序, 注意到如果正着建图("a出现早于b"=>"a向b连边" ...
- BZOJ 2535:NOI 2010 航空管制
[NOI2010]航空管制 题面请点上面. 首先第一问,我第一想法是把它放到一个小根堆中,然而这是不行的. 正确的思路是,把图反过来建,然后放到一个大根堆里去. 至于原因,感性理解一下,正着贪是有后效 ...
- 【BZOJ2109/2535】【NOI2010】航空管制(贪心)
[BZOJ2109/2535][NOI2010]航空管制(贪心) 题面 BZOJ2109 BZOJ2535 题解 很好玩的一道题目 先看第一问,显然是要找一个合法的拓扑排序的序列. 直接拓扑排序,把队 ...
随机推荐
- jQuery Ajax实例 ($.ajax_$.post_$.get)
Jquery在异步提交方面封装的很好,直接用AJAX非常麻烦,Jquery大大简化了我们的操作,不用考虑浏览器的诧异了. $.post.$.get是一些简单的方法,如果要处理复杂的逻辑,还是需要用到j ...
- C# 之文件拖拽和pixturBox缩放与拖拽
文件拖拽: 效果:将一个文件拖拽到窗体的某个控件时,将该控件的路径显示在该控件上,只要拿到了路径自然可以读取文件中的内容了. 将一个控件的属性AllowDrop设置为true,然后添加DragDrop ...
- 局域网内配置虚拟机的hostname
一般上我们在局域网内访问,比如宿主机访问虚拟机的时候可以直接使用IP去访问,大多数情况下也都适用.但是对于有的情况,比如像新版的hbase的配置,它默认将localhost作为hbase.master ...
- 撩课-Python-每天5道面试题-第5天
一. 给定一个圆心和半径, 以及一个点坐标, 判定该点是否在圆内; 例如: 用户输入圆心: (1, 2) 半径: 2.5 测试点为(2, 2)结果: 判定测试点是在圆内 思路: 结合勾股定理, 计算测 ...
- hdu 4193 Non-negative Partial Sums 单调队列。
Non-negative Partial Sums Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- USACO08MAR土地购买 与 APIO2010特别行动队
两道斜率优化DP: 土地购买 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土 地,价格就是土地的面积.但他可以选择并购一组土地,并购的价格为这些土地中最大的长 乘以最大的 ...
- C语言——链式存储实现栈的基本运算算法
Lkstack.h // 链栈的定义 typedef struct node { int data; struct node *next; }LkStk; main.c #include <st ...
- AutoCAD LoadLibrary Failed with error 126 Message
LoadLibrary Failed with error 126 Message BY C3DISH ON 26 MAY, 2013 · ADD COMMENT I wanted to post a ...
- Android自定义View之绘制虚线
现在实现一个效果,有个虚线分割和阴影效果.一个一个实现. 分为2中方式. 1.设计出图,我们SRC引入进来(最简单,但是需要其他资源支持). 2.code实现,有些难度,需要查资料. 现在把第2种方式 ...
- Azure 中快速搭建 FTPS 服务
FTP,FTPS 与 SFTP 的区别 FTP (File Transfer Protocol)是一种常用的文件传输协议,在日常工作中被广泛应用.不过,FTP 协议使用明文传输.如果文件传输发生在公网 ...