[CF1062F]Upgrading Cities[拓扑排序]
题意
一张 \(n\) 点 \(m\) 边的 \(DAG\) ,问有多少个点满足最多存在一个点不能够到它或者它不能到。
\(n,m\leq 3\times 10^5\)
分析
考虑拓扑排序,如果 \(A\) 能够到 \(B\) ,那么 \(A,B\) 一定不能同时存在于队列中。
所以如果队列中同时存在的点超过了2个,队列中的点都是不合法的。
如果队列中只有一个点,那么剩下的没进队的点他都可以到达;如果队列中有两个点 \(a,b\),且 \(b\) 能够到达一个入度为1的点 \(c\),此时 \(a\) 一定不能够到 \(c\) ,否则 \(a\) 可以到剩下所有的点.
然而一对点不能互相到达不一定体现在同时存在于队列中,因为可能 \(a\) 已经出队后 \(b\) 才进队。但是 \(a\) 一定不会出现在 \(b\) 能够到达(被到达)的点集中(反向建边再跑一遍求被到达),所以判断每个点能够到达(被到达)的点集大小是否 \(\geq n-2\) 即可。
总时间复杂度为 \(O(n)\) 。
代码
#include<bits/stdc++.h>
using namespace std;
#define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].lst,v=e[i].to)
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pb push_back
typedef long long LL;
inline int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
return x*f;
}
template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
const int N=3e5 + 7;
int edc,n,m,sel;
int head[N],mark[N],u[N],v[N],ind[N],f[N],q[N],hd,tl;
struct edge{
int lst,to;
edge(){}edge(int lst,int to):lst(lst),to(to){}
}e[N*2];
void Add(int a,int b){
e[++edc]=edge(head[a],b),head[a]=edc;
++ind[b];
}
void solve(int x,int y,int w){
bool fg=0;
go(y) if(ind[v]==1){fg=1;break;}
if(fg) mark[x]=1;
else f[x]+=w;
}
void topo(){
hd=1,tl=0;
rep(i,1,n) if(!ind[i]) q[++tl]=i;
for(;hd<=tl;++hd){
int u=q[hd];
if(hd==tl) f[u]+=n-tl;
if(tl-hd==1) solve(q[tl-1],q[tl],n-tl);
go(u)if(--ind[v]==0) q[++tl]=v;
}
}
int main(){
n=gi(),m=gi();
for(int i=1;i<=m;++i){
u[i]=gi(),v[i]=gi();
Add(u[i],v[i]);
}
topo();
memset(ind,0,sizeof ind);
memset(head,0,sizeof head);edc=0;
rep(i,1,m) Add(v[i],u[i]);
topo();
int ans=0;
rep(i,1,n) if(!mark[i]&&f[i]+1>=n-1) ++ans;
printf("%d\n",ans);
return 0;
}
[CF1062F]Upgrading Cities[拓扑排序]的更多相关文章
- CF1062F Upgrading Cities
题意 由于这是个\(DAG\),我们考虑拓朴排序,求某个点能到的和能到它的点,这是两个问题,我们可以正反两边拓朴排序,这样就只用考虑它能到的点了 设\(f[x]\)表示\(x\)能到的点数\(+\)能 ...
- 拓扑排序 --- hdu 4948 : Kingdom
Kingdom Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- 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 ...
- POJ3249 Test for Job(拓扑排序+dp)
Test for Job Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10137 Accepted: 2348 Des ...
- 算法与数据结构(七) AOV网的拓扑排序
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
- 有向无环图的应用—AOV网 和 拓扑排序
有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林 ...
- 【BZOJ-2938】病毒 Trie图 + 拓扑排序
2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 609 Solved: 318[Submit][Status][Di ...
- BZOJ1565 [NOI2009]植物大战僵尸(拓扑排序 + 最大权闭合子图)
题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=1565 Description Input Output 仅包含一个整数,表示可以 ...
- 图——拓扑排序(uva10305)
John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...
随机推荐
- LeetCode 题解之Linked List Cycle II
1.题目描述 2.问题分析 使用快慢指针方法判断链表是否有环,然后寻找环开始的节点. 3.代码 ListNode *detectCycle(ListNode *head) { if( head == ...
- excel文件使用navicat工具导入mysql的方法
1.在excel文件的sheet上,第1行下面插入一行,对应DB里面的字段名称,方便后面导入时做字段匹配: 2.使用Navicat ,打开工具,选择表所在的数据库,然后点击数据库名字,右键Tables ...
- 转:queue
数据结构C#版笔记--队列(Quene) 队列(Quene)的特征就是“先进先出”,队列把所有操作限制在"只能在线性结构的两端"进行,更具体一点:添加元素必须在线性表尾部进行, ...
- 隐藏linux软件及内核版本
在登陆linux主机本地(非xshell或crt)前,会显示系统的版本和内核: 那么我们如何隐藏呢?如下: 1.清空版本及内核信息: [root@bqh-01 ~]# cat /etc/issue C ...
- kettle数据同步
通过kettle实现两张表的数据同步,具体设计如下:
- PgSQL基础之 pgsql与mysql的简单区别
1.支持的booloan类型的值 mysql并不支持boolean类型,即便当我们创建了boolean的字段属性之后,mysql会自动将其转化为tinyint(1)类型.当插入“true”的时候,其值 ...
- 乘风破浪:LeetCode真题_037_Sudoku Solver
乘风破浪:LeetCode真题_037_Sudoku Solver 一.前言 这次我们对于上次的模型做一个扩展并求解. 二.Sudoku Solver 2.1 问题 2.2 分析与解决 这道题 ...
- beta阶段学习博客(一) js交互
js交互 js交互的三种方法
- 聊聊MySQL的子查询
1. 背景 在之前介绍MySQL执行计划的博文中已经谈及了一些关于子查询相关的执行计划与优化.本文将重点介绍MySQL中与子查询相关的内容,设计子查询优化策略,包含半连接子查询的优化与非半连接子查询的 ...
- Angular简介与程序架构
什么是angularJs 基于javascript开发的客户端应用框架,使我们可以更加快捷,简单的开发web应用. 诞生于2009年,后来被google收购,用在了很多项目中. 适用于CRUD应用或者 ...