NC51011. 可达性统计
描述
输入描述
第一行两个整数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; } }