题目链接:传送门

描述

给定一张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;
}

最新文章

  1. Nginx的第一个模块-HelloWorld
  2. vector使用篇之erase
  3. TFS 2010 迁移/重装/还原 步骤
  4. .NET跨平台实践:用C#开发Linux守护进程(转)
  5. select框内容的编辑、修改、添加、删除操作
  6. [MSSQL]如何高效查询表的总记录数
  7. scau 8633 回文划分
  8. WinForm打包后皮肤无效(解决方案)
  9. error C2061: syntax error : identifier &#39;__RPC__out_xcount_part&#39;
  10. cf-A. Wet Shark and Odd and Even(水)
  11. selenium C#下的zencart自动化测试(WFloginUrlPayment)环境4.0
  12. Anton and School
  13. Markdown常用语法对应
  14. 西电2017ACM网络赛
  15. eclipse配置maven + 创建maven项目(三)
  16. Linux下SVN安装配置以及使用
  17. 从零开始学Web之HTML(二)标签、超链接、特殊符号、列表、音乐、滚动、head等
  18. 【移动端web】软键盘兼容问题
  19. 工作5年的Java程序员,才学会阅读源码,可悲吗?
  20. 一个python小白的学习之路

热门文章

  1. SNF快速开发平台MVC-集成了百度开源项目echars
  2. 安装配置OSA运维管理平台
  3. 游戏编程精粹学习 - 使用Bloom过滤来提高计算性能(BloomFilter)
  4. [k8s]nginx-ingress配置4/7层测试
  5. leetcode笔记:3Sum Closest
  6. vue中使用localstorage
  7. 带cookie跨域问题的思路以及echo的解决方案
  8. java框架篇---hibernate之连接池
  9. hdoj:2037
  10. Fedora Server 21下OpenJdk和Oracle Jdk共存