列表

详情


NC51011. 可达性统计

描述

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

输入描述

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

输出描述

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

示例1

输入:

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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 306ms, 内存消耗: 113124K, 提交时间: 2020-03-21 22:27:45

#include<bits/stdc++.h>
using namespace std;
const int maxn=3e4+10;
vector<int> v[maxn];
bitset <30005> f[maxn];
void dfs(int x)
{
	if(f[x].any())	return;
	f[x][x]=1;
	for(int i=0;i<v[x].size();i++){
		dfs(v[x][i]);
		f[x]|=f[v[x][i]];
	}
}
int main()
{
	int n,m;scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int t1,t2;scanf("%d%d",&t1,&t2);
		v[t1].push_back(t2);
	}
	for(int i=1;i<=n;i++){
		dfs(i);cout<<f[i].count()<<endl;
	}
}

C++ 解法, 执行用时: 226ms, 内存消耗: 113784K, 提交时间: 2022-07-15 14:26:54

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=3e4+100;
int n,m;
bitset<N>f[N];
vector<int>edge[N];
void dfs(int x){
    if(f[x].any()) return ;
	f[x][x]=1;
	for(int i:edge[x]){
		dfs(i);
		f[x]|=f[i];
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;cin>>u>>v;
		edge[u].push_back(v);
	}
	for(int i=1;i<=n;i++){
		dfs(i);
		cout<<f[i].count()<<endl;
	}
} 

上一题