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

思路:每一个节点可到达的节点总数等于其所有子节点可达到的节点之和,利用bitset降低空间复杂度以及或运算求可达节点数。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <cstdio>
#include <bitset>
using namespace std;
const int N=30010,M=N*2;
//std::ios::sync_with_stdio(false); 读入优化
struct node{int a,b,w;bool operator <(const node &W){return w<W.w;}
}E[N];int n,m,ans,res;
int e[N],h[N],ne[N],idx;
int d[N],seq[N];
bitset<N> f[N];void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}void topsort()
{int k=0;queue<int> q;for(int i=1;i<=n;i++)if(!d[i])q.push(i);while(q.size()){int t=q.front();q.pop();seq[k++]=t;for(int i=h[t];~i;i=ne[i]){int j=e[i];d[j]--;if(!d[j])q.push(j);}}
}int main(){std::ios::sync_with_stdio(false);memset(h,-1,sizeof(h));cin>>n>>m;for(int i=1;i<=m;i++){int a,b;cin>>a>>b;add(a,b);d[b]++;}topsort();for(int i=n-1;i>=0;i--){int j=seq[i];f[j][j]=1;for(int k=h[j];~k;k=ne[k]){f[j]|=f[e[k]];}}for(int i=1;i<=n;i++) cout<<f[i].count()<<endl;return 0;
}

可达性统计(拓扑排序逆推)相关推荐

  1. 2019 ICPC Asia Nanjing Regional C.Digital Path(拓扑排序递推DP)

    整理的算法模板合集: ACM模板 题目传送门 三段题面,只有第三段是有用的-前两段又长单词又难懂,就是在讲故事...不过针对四种情况给出四个图帮助我们理解题意是真的赞,可能出题人怕我们看不懂吧(第一句 ...

  2. P6134 [JSOI2015]最小表示(拓扑排序递推 + bitset优化,可达性统计变种)

    整理的算法模板合集: ACM模板 P6134 [JSOI2015] 题目要求删除一条边整个图的连通性是不受影响的,也就是说如果我们要删除边(x,y)(x,y)(x,y),删除以后整个图的连通性不受影响 ...

  3. 拓扑排序及逆拓扑排序

    拓扑排序其实就是对有向无环图的顶点的一种排序,每个顶点出现且只出现一次. 对一个AOV网进行拓扑排序的方法: 1.从AOV网中选择一个入度为0的顶点并输出: 2.从网中删除该顶点和所有以它为起点的有向 ...

  4. 【图论专题】拓扑排序

    拓扑排序 给定一张有向无环图,若一个序列A满足图中的任意一条边(x,y)x都在y的前面呢么序列A就是图的拓扑排序 实际上拓扑排序就是满足所有的边x指向y,x一定在y的前面.这样按照拓扑排序递推,就可以 ...

  5. 数据结构(六):图的概念、存储方式、基本操作、最小生成树、最短路径、有向无环图、关键路径 | Prim、Kruskal算法 | BFS、Dijkstra、Floyd算法 | 拓扑排序 | 求关键路径

    文章目录 第六章 图 一.图 (一)图的定义 (二)图逻辑结构的应用 (三)无向图.有向图 (四)简单图.多重图 (五)顶点的度.入度.出度 (六)顶点-顶点的关系描述 (七)连通图.强连通图 (八) ...

  6. 模板 - 拓扑排序

    整理的算法模板合集: ACM模板 目录 toposort模板 拓扑排序判断是否有环 已有编号求字典序最小的拓扑序(优先队列) 给所有点分配编号使得拓扑序的字典序最小(反图.优先队列) 拓扑排序 给定一 ...

  7. 洛谷 P1983 车站分级(拓扑排序)

    https://www.luogu.com.cn/problem/P1983 思路 对于每一趟车,将其经过的车站中,停靠的和不停靠的连一条边,注意边的去重,要双向标记,不然有个点会超时,这样拓扑排序递 ...

  8. C语言-AOV网与拓扑排序

    邻接表: 顶点下标查找函数(LocateVex) 创建有向图的邻接表(CreateDG) 邻接表打印函数(print) 拓扑排序(TopologicalSort) AOV网与AOE网: AOV网(Ac ...

  9. 164. 可达性统计【拓扑排序 / bitset】

    无环说明一定有拓扑排序. 我们得到拓扑排序,倒着推.注意压位. #include<bits/stdc++.h> #include<bitset> using namespace ...

最新文章

  1. 人事信息管理系统(PMS)
  2. Servlet简介与Servlet和HttpServlet运行的流程
  3. matlab理想低通滤波器代码_自己动手,解开Matlab下AMD锐龙处理器性能封印
  4. 京东商品详情页碎碎念
  5. 二级菜单HTML原理,CSS多级菜单的实例代码讲解
  6. mysql左键关联_MySQL的:左键删除重复列加入,3个表
  7. mysql查询单词出现的位置_在MySQL中从左侧获取一些单词
  8. android语音识别开源代码,android语音识别,有没有相应的源码,教程可以推荐啊?
  9. docker 容器 exited_Docker实战006:docker容器使用详解
  10. Dart基础-泛型和库
  11. [No000023]为何没有更多人从事程序员的工作?程序员常有,优秀程序员不常有!...
  12. python open 文件操作
  13. 玩转飞思卡尔在线调试工具FreeMaster
  14. 分布式文件存储-FastDFS原理简介
  15. PHP爬虫最全总结2-phpQuery,PHPcrawer,snoopy框架中文介绍
  16. vue 设置表单必填项
  17. 第2次作业—— 时事点评
  18. 这些天学C++到学ROS,都感觉视频教程效果好些。效率也高些,相比于单自己看书而言。
  19. 苹果开发者注册设备异常记录
  20. 页面从后台接口获取数据流显示照片

热门文章

  1. Win10家庭版gpedit.msc命令打不开组策略的解决方案
  2. 【面试题,一个星期4轮面试终拿下offer
  3. ASEMI整流模块MDA110-16参数,MDA110-16规格
  4. 将eclipse配置成可迁移,即直接复制就可以使用
  5. Python中bs包的使用
  6. win10下anaconda、tensorflow-cpu以及tensorflow-gpu安装
  7. 云米携手coKiing发布高端AI变频空调,提前卡位5G智能家居市场
  8. 阿里云OSS PicGo 配置图床教程 超详细
  9. Oracle ASM的AU(Allocation units)分配
  10. 一个完整的大作业:80电影天堂网站