题目链接:传送门

描述

给定一张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. 基于Centos搭建 Mono 开发环境

    系统要求: CentOS 7.2 64 位操作系统 安装 Mono 安装前的准备 yum install yum-utils 执行命令添加安装包仓库 rpm --import "http:/ ...

  2. 解决ScrollView嵌套RecyclerView出现item显示不全的问题

      问题:ScrollView嵌套RecyclerView时,RecyclerView的item显示不全 出现问题不要慌,耐心解决才是王道,哈哈.首先说下出现这个问题的情景吧,首先声明这个问题在23版 ...

  3. C# 版本的24点实现

    C# 版本的24点实现. 已经实现基本功能,可以正确的算 3, 3, 8, 8 这类组合. 稍加修改就可以支持任意数目的操作数和操作符组合形成的四则运算表达式,不限于24点. 代码还比较简单粗糙,晚一 ...

  4. 相关系数(CORRELATION COEFFICIENTS)会骗人?

    CORRELATION COEFFICIENTS We've discussed how to summarize a single variable. The next question is ho ...

  5. java中自定义注释@interface的用法

    一.什么是注释     说起注释,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描述数据的.就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义.而J ...

  6. Java知多少(49)throw:异常的抛出

    到目前为止,你只是获取了被Java运行时系统抛出的异常.然而,程序可以用throw语句抛出明确的异常.Throw语句的通常形式如下:    throw ThrowableInstance;这里,Thr ...

  7. python中的列表、元组、数组——是不是特别容易混淆啊??

    列表: 1. 即list, 是python内置的数据类型.  它的形式是: a = [1, 2, 3, 4, 5] 2. 列表内的值是可以改变的:  即可以这样子: a[0] = 100,  把列表的 ...

  8. Spring 3 Java Based Configuration with @Value

    Springsource has released the Javaconfig Framework as a core component of Spring 3.0. There is a tre ...

  9. [TensorBoard] Name & Variable scope

    TF有两个scope, 一个是name_scope一个是variable_scope 第一个程序: with tf.name_scope("hello") as name_scop ...

  10. KSQL和Flink SQL的比较

    Confluent公司于2017年11月宣布KSQL进化到1.0版本,标志着KSQL已经可以被正式用于生产环境.自那时起,整个Kafka发展的重心都偏向于KSQL——这一点可以从Confluent官方 ...