首页 > 其他分享 >164. 可达性统计 topsort

164. 可达性统计 topsort

时间:2024-08-22 17:17:22浏览次数:5  
标签:din idx int ne ++ topsort 164 可达性 dp


// 164. 可达性统计.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*
https://www.acwing.com/problem/content/166/

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

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

数据范围
1≤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
*/
#include <iostream>
#include <bitset>
#include <queue>

using namespace std;

const int N = 30010;
int h[N], e[N], ne[N], idx;
int n, m;
bitset<N> dp[N];
int din[N], dout[N];
bool vis[N];

void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

void topsort() {
	queue<int> q;
	for (int i = 1; i <= n; i++) {
		if (din[i] == 0) {
			q.push(i);
		}
	}
	vector<int> pv;
	while (q.size()) {
		int t = q.front(); q.pop();
		pv.push_back(t);
		for (int i = h[t]; i != -1; i = ne[i]) {
			int j = e[i];
			din[j]--;
			if (din[j] == 0) {
				q.push(j);
			}
		}
	}
}

void dfs(int x) {
	if (vis[x] == true) return;
	vis[x] = true; dp[x].set(x);
	for (int i = h[x]; i != -1; i = ne[i]) {
		int j = e[i];
		dfs(j);
		dp[x] |= dp[j];
	}
}


int main()
{
	cin >> n >> m;
	memset(h, -1, sizeof h);
	for (int i = 0; i < m; i++) {
		int a, b; cin >> a >> b;
		add(a, b);
		din[b]++; dout[a]++;
	}

	topsort();

	for (int i = 1; i <= n; i++) {
		dfs(i);
	}

	for (int i = 1; i <= n; i++) {
		cout << dp[i].count() << endl;
	}
}

标签:din,idx,int,ne,++,topsort,164,可达性,dp
From: https://www.cnblogs.com/itdef/p/18374350

相关文章

  • postgresql 定时收集表和索引统计信息 转发:https://blog.csdn.net/weixin_33711641/a
    --由于pg中表和索引的信息收集都是基于时间点的,对于以往的信息无法与现在的信息进行对比,故写下此工具进行统计信息收集--创建数据信息的schemacreateschemadb_stat;--创建收集信息的基础表createtabledb_stat.snapshot_pg_stat_all_indexes(relidint,indexrelidint,scheman......
  • Java中的可达性分析算法图解,以及哪些对象可以作为GCRoots
    可达性分析算法图示:解释:因为在GCRoots中存在对于对象A的引用,而A又持有对对象B和对象C的引用,所以这一串都是有用的引用链,需要保留。对于对象D和对象E,他们只是相互进行引用,并没有和GCRoots中的对象有任何的关联,所以可以安全的回收。哪些对象可以作为GCRoots虚拟机栈(栈帧中的......
  • 代码随想录 day 54 字符串接龙 | 有向图的完全可达性 | 岛屿的周长
    字符串接龙字符串接龙解题思路利用每次更改一次的特性在字典中来找到符合条件的字符串,同时,我们利用set数据结构来筛选该字符串是否被访问过,同时记录到达该字符串所需要的路径长度知识点心得有向图的完全可达性有向图的完全可达性解题思路有向图和无向图的区别在于它的边......
  • CF1647F Madoka and Laziness 题解
    CF1647F给定排列\(p\),将其划分为两个单峰子序列,求两个单峰子序列的峰的组合的情况数。\(2\leqn\leq5\times10^5\)首先要注意到一个非常常见的地方:两个单峰子序列中的一个的峰值一定在整个排列\(p\)的最大值处这个非常显然,但并不注意到他的重要性,容易被忽视为......
  • 164首经典常用方剂分类歌诀 – 经方派
    入门方歌歌诀164首经典常用方剂分类歌诀1786阅读第一章解表剂1.麻黄汤方歌:麻黄汤中用桂枝,杏仁甘草四般施,发热恶寒头项痛,喘而无汗宜服之。2.桂枝汤方歌:桂枝汤治太阳风,芍药甘草姜枣同,解肌发表调营卫,表虚有汗此为功。3.九味羌活汤方歌:九味羌活用防风,细辛苍芷与川芎,黄芩生地同......
  • P10480 可达性统计(拓扑,bitset 优化)
    link从数的角度来看,如果知道任意一个点能到达的点的数量,那么它的前驱节点一定也能到达,但是,只累加数的话无法处理可能存在重合点的情况。所以,考虑从集合的角度,设\(f(x)\)表示\(x\)能到达的点的集合如果\(x\)有邻点\(y_1,y_2,...,y_k\),那么\(x\)能到达的点就是它的邻点......
  • 拓扑排序——AcWing 164. 可达性统计
    目录拓扑排序定义运用情况注意事项解题思路AcWing164.可达性统计题目描述运行代码代码思路改进思路拓扑排序定义拓扑排序(TopologicalSort)是对有向无环图(DirectedAcyclicGraph,简称DAG)的一种排序方式。在一个有向无环图中,拓扑排序的结果是一个线性的顶点序列,其......
  • [CF1646F] Playing Around the Table 的题解
    题目大意有\(n\)种牌,一种\(n\)张,一共\(n\)个玩家,一人\(n\)个。每个人一次将一张牌对给下家,求构造方案使可以在\(n\cdot(n-1)\)次操作之内使第\(i\)个人拥有\(n\)张\(i\)。数据范围满足,\(1\len\le100\)。思路因为直接构造出题目要求的情况会出现如果一个人提......
  • (nice!!!)LeetCode 3164. 优质数对的总数 II(数组、哈希表)
    3164.优质数对的总数II思路:先找出可以被k整除的nums[i].方法一:统计因子。1、找出数组nums1每个元素的因子,用哈希表来记录每个因子出现的次数。然后再遍历数组nums2进行累加即可。classSolution{public:constintN=1e6+10;longlongnumberOfPairs(vec......
  • [MdOI R5] Many Minimizations & [ARC164F] Many Increasing Problems 题解
    讲下一个思路比较自然的基于自然数幂和的\(O(n\logn)\)且复杂度与\(m\)几乎无关的做法。不难发现让我们计数的问题是保序回归\(L_1\)中一条链的情况。这个情况有一个简单的slope-trick做法:用堆维护斜率,每次push进去两个当前的数,然后pop出一个最大值。最终所有数的和......