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

输入格式

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

输出格式

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

数据范围

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

输入样例:

  1. 10 10
  2. 3 8
  3. 2 3
  4. 2 5
  5. 5 9
  6. 5 9
  7. 2 3
  8. 3 9
  9. 4 8
  10. 2 10
  11. 4 9

输出样例:

  1. 1
  2. 6
  3. 3
  4. 3
  5. 2
  6. 1
  7. 1
  8. 1
  9. 1
  10. 1

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

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

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <bitset>
  5. #include <queue>
  6.  
  7. using namespace std;
  8.  
  9. const int maxn = 3e4+;
  10.  
  11. vector<int> g[maxn];
  12. vector<int> a;
  13. bitset<maxn> f[maxn];
  14.  
  15. int in[maxn];
  16. int n, m;
  17.  
  18. void topsort() {
  19. queue<int> q;
  20. for(int i = ; i <= n; i++) {
  21. if(in[i] == ) {
  22. q.push(i);
  23. }
  24. }
  25. while(!q.empty()) {
  26. int u = q.front();
  27. q.pop();
  28. a.push_back(u); //记录拓扑序列
  29. int len = g[u].size();
  30. for(int i = ; i < len; i++) {
  31. int v = g[u][i];
  32. if(--in[v] == ) {
  33. q.push(v);
  34. }
  35. }
  36. }
  37. }
  38.  
  39. void sovle() {
  40. for(int i = a.size() - ; i >= ; i--) {
  41. int u = a[i];
  42. f[u].reset(); //清空数组
  43. f[u][u] = ; //将当前位置赋1
  44. int len = g[u].size();
  45. for(int j = ; j < len; j++) {
  46. int v = g[u][j];
  47. f[u] = f[u] | f[v]; //将经过的点的状态压缩到当前数组中
  48. }
  49. }
  50. }
  51.  
  52. int main() {
  53. scanf("%d %d", &n, &m);
  54. for(int i = ; i <= m; i++) {
  55. int u, v;
  56. scanf("%d %d", &u, &v);
  57. g[u].push_back(v);
  58. in[v]++;
  59. }
  60. topsort();
  61. sovle();
  62. for(int i = ; i <= n; i++) {
  63. printf("%d\n", f[i].count());
  64. }
  65. return ;
  66. }

AcWing:164. 可达性统计(拓扑排序 + 状态压缩算法)的更多相关文章

  1. AcWing 164. 可达性统计

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

  2. Acwing-164-可达性统计(拓扑排序, 位运算统计)

    链接: https://www.acwing.com/problem/content/166/ 题意: 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量. 思路: 先拓扑排序求 ...

  3. AcWing P164 可达性统计 题解

    Analysis 这道题我一开始想到的是传递闭包,但是时间复杂度是n³,也开不下30000*30000的数组,所以我想到了拓扑+状态压缩(bitset),从后往前找,把能到达的点能到哪里用位运算赋到上 ...

  4. CH2101 可达性统计(算竞进阶习题)

    拓扑排序+状态压缩 考虑每一个点能够到达的所有点都是与该店相邻的点的后继节点,可知: 令f[u]表示u点可到达的节点个数,f[u]={u}与f[v](u, v)的并集 于是可以利用状态压缩,能够到达的 ...

  5. 图的拓扑排序,AOV,完整实现,C++描述

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

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

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

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

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

  8. ZJU 1346 Comparing Your Heroes 状态压缩DP 拓扑排序的计数

    做多校的时候遇见一个求拓扑排序数量的题,就顺便来写了一下. 题意: 你有个朋友是KOF的狂热粉丝,他有一个对其中英雄的强弱比较,让你根据这些比较关系来给这些英雄排名.问一共有多少种排名方式. 思路: ...

  9. 洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)

    洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的 ...

随机推荐

  1. 作业2:java内存模型图示

    参考:http://www.infoq.com/cn/minibooks/java_memory_model?utm_source=infoq&utm_campaign=user_page&a ...

  2. 【weixi】微信支付---微信公众号JSAPI支付

    一.JSAPI支付 JSAPI支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付.应用场景有: ◆ 用户在微信公众账号内进入商家公众号,打 ...

  3. O026、Nova组件详解

    参考https://www.cnblogs.com/CloudMan6/p/5436855.html   本节开始,我们将详细讲解 Nova 的各个子服务.   前面架构概览一节知道 Nova 有若干 ...

  4. mybatis-plus使用Oracle函数生成主键

    函数的调用方式为: select pkg1.fun1 from dual; mybatis-plus一般会使用的主键生成策略为: @Bean public OracleKeyGenerator ora ...

  5. React学习——子组件给父组件传值

    //子组件 var Child = React.createClass({ render: function(){ return ( <div> 请输入邮箱:<input onCha ...

  6. 1 sql server中添加链接服务器

    1  链接到另一个sql server 的实例 exec sp_addlinkedserver @server= '服务器的地址',@srvproduct='SQL Server' go 分布式查询中 ...

  7. element-ui select

    1. 组合 label <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...

  8. 安装grafna已经grafna对接zabbix

    安装插件 grafana-cli plugins install alexanderzobnin-zabbix-app 重启grafna systemctl restart grafana-serve ...

  9. golang实现RSA加密解密

    非对称加密示意图: 在此可以看到,非对称加密是通过两个密钥(公钥-私钥)来实现对数据的加密和解密的.公钥用于加密,私钥用于解密. RSA公钥和私钥生成: package main import ( & ...

  10. JavaMaven【一、概述&环境搭建】

    课程概述 JavaMaven[一.概述&环境搭建] JavaMaven[二.目录结构&HelloMaven] JavaMaven[三.常用指令] JavaMaven[四.坐标& ...