关于拓扑排序的反建图还是一个非常套路的东西

比如说[HNOI2015]菜肴制作

我们希望使得某一个东西在拓扑序中出现的尽可能早,这个时候就可以建出一张反图来,使得这个东西在反图中的拓扑序尽量靠后,从而使得其出现的尽可能地早

这是为什么呢,比如说我们希望\(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]航空管制】的更多相关文章

  1. NOI2010航空管制

    2008: [Noi2010]航空管制 Time Limit: 10 Sec  Memory Limit: 552 MBSubmit: 31  Solved: 0[Submit][Status] De ...

  2. [BZOJ2109][NOI2010]航空管制(贪心+拓扑)

    2109: [Noi2010]Plane 航空管制 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1227  Solved: 510[Submit][ ...

  3. bzoj2535 [Noi2010]航空管制

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

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

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

  5. NOI2010 航空管制

    http://www.lydsy.com/JudgeOnline/problem.php?id=2535 贪心. 对于第1个问,我们先建立拓扑图,对于如果a必须在b前起飞,那么连有向边b->a, ...

  6. BZOJ.2109.[NOI2010]航空管制(拓扑 贪心)

    题目链接 双倍经验(没有第一问) \(Description\) \(Solution\) 第一问拓扑排序即可. 第二问,即让一个元素在拓扑序中尽量靠前,好像不好做. 但是可以让一个元素出现尽量靠后. ...

  7. 洛谷 P1954 [NOI2010]航空管制

    https://www.luogu.org/problemnew/show/P1954 拓扑排序, 注意到如果正着建图("a出现早于b"=>"a向b连边" ...

  8. BZOJ 2535:NOI 2010 航空管制

    [NOI2010]航空管制 题面请点上面. 首先第一问,我第一想法是把它放到一个小根堆中,然而这是不行的. 正确的思路是,把图反过来建,然后放到一个大根堆里去. 至于原因,感性理解一下,正着贪是有后效 ...

  9. 【BZOJ2109/2535】【NOI2010】航空管制(贪心)

    [BZOJ2109/2535][NOI2010]航空管制(贪心) 题面 BZOJ2109 BZOJ2535 题解 很好玩的一道题目 先看第一问,显然是要找一个合法的拓扑排序的序列. 直接拓扑排序,把队 ...

随机推荐

  1. guava快速入门(三)

    Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives support] ...

  2. table中td 内容超长 自动折行 (含字母数字文字)

    <table style="width:100%;table-layout:fixed;"> //列宽由表格宽度和列宽度设定 <thead> <th& ...

  3. IoC容器之Unity

    关于IoC.Unity见博友文章点击这里. 话不多说,上程序HelloUnity,程序采用VS2010,Unity2.1. 1.程序框架如下 2.类库HelloUnity.Objects,主要为实体类 ...

  4. Spring与SpringMVC的关系

    在此鉴于你已经了解过Spring的相关知识,简单描述一下Spring与Spring的关系 在框架的使用中,Spring类似于一个具有多种特性,也可以说是多种功能模块的应用平台,(特性就比如IoC,AO ...

  5. 【10】Quartz.net 定时服务实例

    一.安装nuget包 Install-Package Quartz Install-Package Common.Logging.Log4Net1211 Install-Package log4net ...

  6. redisTemplate 总结

    依赖jar包 jackson <dependency> <groupId>com.fasterxml.jackson.core</groupId> <arti ...

  7. Spring中的Bean配置方式

    1.IOC和DI概述 IOC(Inversion of Control):其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源. 作为回应, 容器适时的返回资源. 而应用了 ...

  8. csharp: using wininet.dll

    /// <summary> /// Windows Embedded CE 6.0 R3 WinInet Functions /// https://technet.microsoft.c ...

  9. Tarjan系列1

    tajan的dfs树系列算法: 求解割点,桥,强连通分量,点双联通分量,边双联通分量: tajan是一个dfs,把一个图变成一个dfs树结构, dfs树结构,本质是通过一个没有任何要求的dfs把图的边 ...

  10. js点击事件在苹果端失效的问题

    在安卓机上,我们随意定义点击事件也能够在找到点击的元素,但是在苹果端上就是不行,怎么点击都没有效果.这是因为在苹果机上window禁止了手指误点功能,必须解除这一功能,或者给点击事件指引某个元素上绑定 ...