【CF883B】Berland Army

题意:给出n个点,m条有向边,有的点的点权已知,其余的未知,点权都在1-k中。先希望你确定出所有点的点权,满足:

对于所有边a->b,a的点权>b的点权
对于i=1..k,至少有一个点的点权为i

n,m,k<=100000

题解:像菜肴制作一样奇怪的拓扑排序题,直接上方法吧,不会证。

先正反跑两边拓扑排序,得出每个点点权的下界Li和上界Ri。

将所有点按上界从小到大排序,然后枚举权值i。将所有上界为i的点都扔到堆中,再从堆里取出下界最大的那个点,将其权值赋为i。再找出所有下界为i的点,将他们的权值也都赋为i即可。

#include <cstdio>
#include <cstring>
#include <utility>
#include <queue>
#include <vector>
#define mp(A,B) make_pair(A,B)
using namespace std;
const int maxn=200010;
typedef pair<int,int> pii;
int n,m,k,cnt,flag;
int to[maxn],nxt[maxn],head[maxn],pa[maxn],pb[maxn],v[maxn],L[maxn],R[maxn],d[maxn],ans[maxn];
vector<int> p[maxn];
vector<int>::iterator it;
queue<int> q;
priority_queue<pii> pq;
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
inline void add(int a,int b)
{
to[cnt]=b,nxt[cnt]=head[a],head[a]=cnt++;
}
int main()
{
n=rd(),m=rd(),k=rd();
int i,u;
for(i=1;i<=n;i++)
{
v[i]=rd();
if(!v[i]) L[i]=1,R[i]=k;
else L[i]=R[i]=v[i];
}
memset(head,-1,sizeof(head)),cnt=0;
for(i=1;i<=m;i++) pa[i]=rd(),pb[i]=rd(),d[pb[i]]++,add(pa[i],pb[i]);
for(i=1;i<=n;i++) if(!d[i]) q.push(i);
while(!q.empty())
{
u=q.front(),q.pop();
for(i=head[u];i!=-1;i=nxt[i])
{
d[to[i]]--,R[to[i]]=min(R[to[i]],R[u]-1);
if(!d[to[i]]) q.push(to[i]);
}
}
for(i=1;i<=n;i++) if(d[i]) return puts("-1"),0;
memset(head,-1,sizeof(head)),cnt=0;
for(i=1;i<=m;i++) d[pa[i]]++,add(pb[i],pa[i]);
for(i=1;i<=n;i++) if(!d[i]) q.push(i);
while(!q.empty())
{
u=q.front(),q.pop();
for(i=head[u];i!=-1;i=nxt[i])
{
d[to[i]]--,L[to[i]]=max(L[to[i]],L[u]+1);
if(!d[to[i]]) q.push(to[i]);
}
}
for(i=1;i<=n;i++) if(d[i]||L[i]>R[i]) return puts("-1"),0;
for(i=1;i<=n;i++) p[R[i]].push_back(i);
for(i=k;i>=1;i--)
{
for(it=p[i].begin();it!=p[i].end();it++) pq.push(mp(L[*it],*it));
if(pq.empty()) return puts("-1"),0;
u=pq.top().second,pq.pop(),ans[u]=i;
while(!pq.empty())
{
u=pq.top().second;
if(L[u]<i) break;
pq.pop(),ans[u]=i;
}
}
for(i=1;i<=n;i++) printf("%d ",ans[i]);
return 0;
}

【CF883B】Berland Army 拓扑排序的更多相关文章

  1. 2017-2018 ACM-ICPC NEERC B题Berland Army 拓扑排序+非常伤脑筋的要求

    题目链接:http://codeforces.com/contest/883/problem/B There are n military men in the Berland army. Some ...

  2. Berland Army CodeForces - 883B (贪心,拓扑排序)

    大意: n个点, 点$i$的等级为$r_i$, 只给出部分点的$r$值, $r_i$的范围为[1,k], 且[1,k]都至少有一个. 给定m条有向边, (x,y)表示$r[x]>r[y]$, 求 ...

  3. Codeforces Beta Round #29 (Div. 2, Codeforces format) C. Mail Stamps 离散化拓扑排序

    C. Mail Stamps Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem ...

  4. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  5. 有向无环图的应用—AOV网 和 拓扑排序

    有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林 ...

  6. 【BZOJ-2938】病毒 Trie图 + 拓扑排序

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 609  Solved: 318[Submit][Status][Di ...

  7. BZOJ1565 [NOI2009]植物大战僵尸(拓扑排序 + 最大权闭合子图)

    题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=1565 Description Input Output 仅包含一个整数,表示可以 ...

  8. 图——拓扑排序(uva10305)

    John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...

  9. Java排序算法——拓扑排序

    package graph; import java.util.LinkedList; import java.util.Queue; import thinkinjava.net.mindview. ...

随机推荐

  1. 【python】泰语分词器安装

    1.安装icu http://blog.csdn.net/liyuwenjing/article/details/6105388 2.安装pyicu https://anaconda.org/kale ...

  2. 小程序navigator跳转路径url写法

    小程序navigator跳转路径url要写  要跳转的的页面文件夹相对于当前页面的页面文件夹的位置,即相对路径. 比如我当前页面跳转到同级目录下的另一个页面如下: <navigator url= ...

  3. text/html和text/plain的区别

    1.text/html的意思是将文件的content-type设置为text/html的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理. 2.text/plain的意思是 ...

  4. Java常用数据结构之Set之TreeSet

    前言 上篇文章我们分析了HashSet,它是基于HashMap实现的,那TreeSet会是怎么实现的呢?没错!和大家想的一样,它是基于TreeMap实现的.所以,TreeSet的源码也很简单,主要还是 ...

  5. Windows 下 绿化 Oracle

    既然Oracle在非windows平台上可以很“绿色”的执行,那么在windows平台上有无可能呢? 答案是“Yes-No” 基本上,除了监听器(lisentner)这个异类外,Oracle实例完全可 ...

  6. Windows上使用sqlite3

    安装 去官网http://www.sqlite.org/download.html下载Windows下安装包,下载后,解压,设置环境变量 例如放在D:\sqlite3下,将D:\sqlite3加入环境 ...

  7. ubuntu 的chmod 和 chown

    1.chown改文件或目录的所有者和群组权限 格式 chown [OPTION]... [OWNER][:[GROUP]] FILE... 参数: -R 递归操作当前目录下的所有目录和文件: -h 更 ...

  8. Blender 编辑模式

    1.如何进入编辑模式 可直接通过“Tab”快捷键进入编辑模式,或者选择界面底部的下拉列表: 如果想退出编辑模式,可再按下“Tab”键退出. 2.编辑选择 进入编辑状态后,我们可以通过鼠标右键来选择某个 ...

  9. springboot+jps+druid项目搭建

    pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...

  10. gtk界面设计

    一.GTK基本 #include <gtk/gtk.h> int main( int argc, char *argv[]) { GtkWidget *window; /*初始化整个GTK ...