题目链接:传送门

描述

给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量。N,M≤30000。

输入格式

第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边。

输出格式

共N行,表示每个点能够到达的点的数量。

样例输入

10 10
3 8
2 3
2 5
5 9
5 9
2 3
3 9
4 8
2 10
4 9

样例输出

1
6
3
3
2
1
1
1
1
1

题解:

首先,如果用 $f(x)$ 代表从点 $x$ 出发所能到达的所有点的集合,应有如下公式:

$f(x) = {x} \cup (\bigcup_{edge(x,y)}f(y))$

也就是说我们可以通过某种递推方式,递推出所有点的 $f(x)$。

由此想到有向无环图的拓扑序(对于图中任意一条有向边 $(x,y)$,在该序列中 $x$ 都出现在 $y$ 之前),对有向无环图的拓扑序逆向遍历计算,正好可以正确求出每个点的 $f(x)$。

另外, 我们还可以用状压的方式来存储 $f(x)$,也比较方便转移和存储,这里我们用bitset容器来做状压。

关于bitset:

bitset<> num; 相当于定义了一个1000位的二进制数,其 $1$ 位占用 $1$ 个bit,也就是说 $8$ 位占用一个Byte。

由于估计时间复杂度是我们一般以 $32$ 位整数的运算次数为基准,因此 $n$ 位的bitset执行一次位运算的时间复杂度可以视作 $n/32$。

bitset支持的位运算有按位取反“~”、按位与“&”、按位或“|”、按位异或“^”、左移“<<”、右移“>>”(均用 $0$ 填充),还可以比较是否相等“==”和“!=”。

bitset支持 num[k] 这种形式进行取值或者赋值。根据上面的定义,范围为 num[] 到 num[] 。

bitset还支持:set()全部置 $1$、reset()全部置 $0$、count()统计 $1$ 的数目、any()查询是否存在 $1$、none()查询是否没有 $1$。

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=+;
int n,m;
int indg[maxn];
vector<int> e[maxn];
bitset<maxn> f[maxn]; vector<int> topo;
void TopoSort()
{
topo.clear();
queue<int> Q;
for(int i=;i<=n;i++) if(indg[i]==) Q.push(i);
while(Q.size())
{
int u=Q.front(); Q.pop();
topo.push_back(u);
for(auto v:e[u]) if(--indg[v]==) Q.push(v);
}
} int main()
{
ios::sync_with_stdio();
cin.tie(), cout.tie(); cin>>n>>m;
memset(indg,,sizeof(indg));
for(int i=,x,y;i<=m;i++) cin>>x>>y, indg[y]++, e[x].push_back(y); TopoSort();
for(int i=topo.size()-;i>=;i--)
{
int x=topo[i];
f[x].reset(), f[x][x]=;
for(auto y:e[x]) f[x]|=f[y];
}
for(int i=;i<=n;i++) cout<<f[i].count()<<endl;
}

CH 2101 - 可达性统计 - [BFS拓扑排序+bitset状压]的更多相关文章

  1. 2101 可达性统计(拓扑排序/dfs+状态压缩)

    [题目描述] 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. [题目链接] 2101 可达性统计 [算法] 拓扑排序之后逆序计算(感觉dfs更好写而且应 ...

  2. 牛客 51011 可达性统计(拓扑排序,bitset)

    牛客 51011 可达性统计(拓扑排序,bitset) 题意: 给一个 n个点,m条边的有向无环图,分别统计每个点出发能够到达的点的数量(包括自身) \(n,m\le30000\). 样例: 10 1 ...

  3. AcWing:164. 可达性统计(拓扑排序 + 状态压缩算法)

    给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边. 输出格式 输出共N行,表示每个点能 ...

  4. [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)

    [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset) 题面 题面较长,略 分析 首先,发现火星人只有死和活两种状态,考虑2-SAT 建图 ...

  5. [BZOJ4484][JSOI2015]最小表示[拓扑排序+bitset]

    题意 给你一个 \(n\) 个点 \(m\) 条边的 \(\rm DAG\) ,询问最多能够删除多少条边,使得图的连通性不变 \(n\leq 3\times 10^4\ ,m\leq 10^5\) . ...

  6. NOIP 车站分级 (luogu 1983 & codevs 3294 & vijos 1851) - 拓扑排序 - bitset

    描述 一条单向的铁路线上,依次有编号为 1, 2, ..., n 的 n 个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车 ...

  7. BZOJ4484 JSOI2015最小表示(拓扑排序+bitset)

    考虑在每个点的出边中删除哪些.如果其出边所指向的点中存在某点能到达另一点,那么显然指向被到达点的边是没有用的.于是拓扑排序逆序处理,按拓扑序枚举出边,bitset维护可达点集合即可. #include ...

  8. C. Journey bfs 拓扑排序+dp

    C. Journey 补今天早训 这个是一个dp,开始我以为是一个图论,然后就写了一个dij和网络流,然后mle了,不过我觉得如果空间开的足够的,应该也是可以过的. 然后看了题解说是一个dp,这个dp ...

  9. uvaLA4255 Guess BFS+拓扑排序

    算法指南白书 思路:“连续和转化成前缀和之差” #include <stdio.h> #include <string.h> #include <iostream> ...

随机推荐

  1. (原)pycharm中使用CUDA_VISIBLE_DEVICES

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/8576825.html 如果使用多gpu运行程序,可以直接使用CUDA_VISIBLE_DEVICES= ...

  2. windows下JDK环境配置

    原文地址:http://blog.sina.com.cn/s/blog_618592ea0100oeif.html 一.JDK1.6下载 目前JDK最新版本是JDK1.6,到http://java.s ...

  3. Nuget 配置文件的位置

    最近在 Visual Studio 中使用 Nuget 时,发现总是连接代理服务器,忘了什么时候配置的了,找了半天没找到配置位置,最后发现在这个地方: %appdata%\NuGet 找到 NuGet ...

  4. 基于mindwave脑电波进行疲劳检测算法的设计(4)

    上一次的实验做到可以从pc端读取到MindWave传输过来的脑电波原始数据了. 我是先定义一个结构体,该结构体对应保存所有能从硬件中取到的原始数据. struct FD_DATA { int batt ...

  5. 5. BERT算法原理解析

    1. 语言模型 2. Attention Is All You Need(Transformer)算法原理解析 3. ELMo算法原理解析 4. OpenAI GPT算法原理解析 5. BERT算法原 ...

  6. linux 常用命令1【转】

    1.1. 关机 shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours:minutes & 按预定 ...

  7. R语言使用RMySQL连接及读写Mysql数据库

    简单说下安装过程,一般不会有问题,重点是RMySQL的使用方式. 系统环境说明 Redhat系统:Linux 460-42.6.32-431.29.2.el6.x86_64 系统编码:LANG=zh_ ...

  8. windows 同时启动多个Tomcat 控制台日志(startup.bat)输出到指定文件中

    1 .修改startup.bat第42行 call "%EXECUTABLE%" start %CMD_LINE_ARGS% 为 call "%EXECUTABLE%&q ...

  9. 最全面的Spring-Boot-Cache使用与整合

    一:Spring缓存抽象 Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口 ...

  10. Retrofit/Okhttp API接口加固技术实践(上)

    作者:Tamic 地址:http://blog.csdn.net/sk719887916/article/details/61914609 写这篇文章,我纠结了非常久,究竟是属于app安全系列,还是属 ...