可达性统计(拓扑排序逆推)
给定一张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;
}
可达性统计(拓扑排序逆推)相关推荐
- 2019 ICPC Asia Nanjing Regional C.Digital Path(拓扑排序递推DP)
整理的算法模板合集: ACM模板 题目传送门 三段题面,只有第三段是有用的-前两段又长单词又难懂,就是在讲故事...不过针对四种情况给出四个图帮助我们理解题意是真的赞,可能出题人怕我们看不懂吧(第一句 ...
- P6134 [JSOI2015]最小表示(拓扑排序递推 + bitset优化,可达性统计变种)
整理的算法模板合集: ACM模板 P6134 [JSOI2015] 题目要求删除一条边整个图的连通性是不受影响的,也就是说如果我们要删除边(x,y)(x,y)(x,y),删除以后整个图的连通性不受影响 ...
- 拓扑排序及逆拓扑排序
拓扑排序其实就是对有向无环图的顶点的一种排序,每个顶点出现且只出现一次. 对一个AOV网进行拓扑排序的方法: 1.从AOV网中选择一个入度为0的顶点并输出: 2.从网中删除该顶点和所有以它为起点的有向 ...
- 【图论专题】拓扑排序
拓扑排序 给定一张有向无环图,若一个序列A满足图中的任意一条边(x,y)x都在y的前面呢么序列A就是图的拓扑排序 实际上拓扑排序就是满足所有的边x指向y,x一定在y的前面.这样按照拓扑排序递推,就可以 ...
- 数据结构(六):图的概念、存储方式、基本操作、最小生成树、最短路径、有向无环图、关键路径 | Prim、Kruskal算法 | BFS、Dijkstra、Floyd算法 | 拓扑排序 | 求关键路径
文章目录 第六章 图 一.图 (一)图的定义 (二)图逻辑结构的应用 (三)无向图.有向图 (四)简单图.多重图 (五)顶点的度.入度.出度 (六)顶点-顶点的关系描述 (七)连通图.强连通图 (八) ...
- 模板 - 拓扑排序
整理的算法模板合集: ACM模板 目录 toposort模板 拓扑排序判断是否有环 已有编号求字典序最小的拓扑序(优先队列) 给所有点分配编号使得拓扑序的字典序最小(反图.优先队列) 拓扑排序 给定一 ...
- 洛谷 P1983 车站分级(拓扑排序)
https://www.luogu.com.cn/problem/P1983 思路 对于每一趟车,将其经过的车站中,停靠的和不停靠的连一条边,注意边的去重,要双向标记,不然有个点会超时,这样拓扑排序递 ...
- C语言-AOV网与拓扑排序
邻接表: 顶点下标查找函数(LocateVex) 创建有向图的邻接表(CreateDG) 邻接表打印函数(print) 拓扑排序(TopologicalSort) AOV网与AOE网: AOV网(Ac ...
- 164. 可达性统计【拓扑排序 / bitset】
无环说明一定有拓扑排序. 我们得到拓扑排序,倒着推.注意压位. #include<bits/stdc++.h> #include<bitset> using namespace ...
最新文章
- 人事信息管理系统(PMS)
- Servlet简介与Servlet和HttpServlet运行的流程
- matlab理想低通滤波器代码_自己动手,解开Matlab下AMD锐龙处理器性能封印
- 京东商品详情页碎碎念
- 二级菜单HTML原理,CSS多级菜单的实例代码讲解
- mysql左键关联_MySQL的:左键删除重复列加入,3个表
- mysql查询单词出现的位置_在MySQL中从左侧获取一些单词
- android语音识别开源代码,android语音识别,有没有相应的源码,教程可以推荐啊?
- docker 容器 exited_Docker实战006:docker容器使用详解
- Dart基础-泛型和库
- [No000023]为何没有更多人从事程序员的工作?程序员常有,优秀程序员不常有!...
- python open 文件操作
- 玩转飞思卡尔在线调试工具FreeMaster
- 分布式文件存储-FastDFS原理简介
- PHP爬虫最全总结2-phpQuery,PHPcrawer,snoopy框架中文介绍
- vue 设置表单必填项
- 第2次作业—— 时事点评
- 这些天学C++到学ROS,都感觉视频教程效果好些。效率也高些,相比于单自己看书而言。
- 苹果开发者注册设备异常记录
- 页面从后台接口获取数据流显示照片