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

输入格式

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

输出格式

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

数据范围

1≤N,M≤300001≤N,M≤30000

输入样例:

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

算法:拓扑排序 + 状态压缩算法

题解:首先求出该有向无环图的拓扑序列,根据拓扑序列的性质:在拓扑序种,对于任意一条边(x, y)来说,x都会排在y之前(读者可以自行画图证明)。然后倒叙遍历拓扑序来结果状态压缩来求的结果。

#include <iostream>
#include <cstdio>
#include <vector>
#include <bitset>
#include <queue> using namespace std; const int maxn = 3e4+; vector<int> g[maxn];
vector<int> a;
bitset<maxn> f[maxn]; int in[maxn];
int n, m; void topsort() {
queue<int> q;
for(int i = ; i <= n; i++) {
if(in[i] == ) {
q.push(i);
}
}
while(!q.empty()) {
int u = q.front();
q.pop();
a.push_back(u); //记录拓扑序列
int len = g[u].size();
for(int i = ; i < len; i++) {
int v = g[u][i];
if(--in[v] == ) {
q.push(v);
}
}
}
} void sovle() {
for(int i = a.size() - ; i >= ; i--) {
int u = a[i];
f[u].reset(); //清空数组
f[u][u] = ; //将当前位置赋1
int len = g[u].size();
for(int j = ; j < len; j++) {
int v = g[u][j];
f[u] = f[u] | f[v]; //将经过的点的状态压缩到当前数组中
}
}
} int main() {
scanf("%d %d", &n, &m);
for(int i = ; i <= m; i++) {
int u, v;
scanf("%d %d", &u, &v);
g[u].push_back(v);
in[v]++;
}
topsort();
sovle();
for(int i = ; i <= n; i++) {
printf("%d\n", f[i].count());
}
return ;
}

最新文章

  1. 原生JS下拉加载插件分享。
  2. ANSYS17.0详细安装图文教程
  3. ICTCLAS20160405分词系统调试过程
  4. Oracle12c client安裝報錯[INS-20802] Oracle Net Configuration Assistant failed完美解決
  5. HowTo Perform the spatial selection 'Share a line segment with' using ArcObjects
  6. 命令行 更新Android sdk
  7. 转:python webdriver API 之简单对象的定位
  8. Gstreamer基本概念介绍(开发前必读)
  9. 怎样加快master数据库的写操作?分表原则!将表水平划分!或者添加写数据库的集群
  10. data guard switchover切换异常
  11. MySQL 错误日志(Error Log)
  12. —软测试—(5)计算机系统CPU组成
  13. OpenGL红宝书第一个例子:绘制两个三角形
  14. 安装win7提示“我们无法创建新的分区,也找不到现有分区”
  15. 设置下载文件路径 &amp; 获取接口结尾名称。
  16. [Leetcode 78]求子集 Subset
  17. java遍历ftp文件夹下所有文件(或指定文件下的文件)
  18. DDos与CC攻击的简单个人理解
  19. jdk8新特性-stream
  20. (二)MySQL中级篇

热门文章

  1. java正则表达式的使唤
  2. NPOI_winfrom导出Excel表格(一)(合并单元格、规定范围加外边框、存储路径弹框选择)
  3. 可以用for循环直接删除ArrayList的特定元素吗?可能会出现什么问题?怎样解决?
  4. python版本
  5. WebStorm 启动时提示Failed to load JVM DLL
  6. ftp卡死问题
  7. 如果您的浏览器不支持javascript功能
  8. 第十一章、特性property
  9. Gitlab创建ssh key并添加配置
  10. JSON parse error: syntax error, expect {, actual error, pos 0, fastjson-version 1.2.58; nested exception is com.alibaba.fastjson.JSONExcetion: syntax error, except {, actual error, pos ...