可达性统计
给定一张 n 个点 m 条边的有向无环图,分别统计从每个点出发能够到达的点的数量。
输入格式
第一行两个整数 N,MN,M,接下来 MM 行每行两个整数 x,yx,y,表示从 xx 到 yy 的一条有向边。
输出格式
输出共 NN 行,表示每个点能够到达的点的数量。
数据范围
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
#include <bits/stdc++.h>
using namespace std;
vector<int>g[30003];
int in[30005];
bitset<30003>f[30003];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
while(m--){
int x,y;
scanf("%d%d",&x,&y);
g[x].push_back(y);
in[y]++;
}
queue<int>q;
for(int i=1;i<=n;i++)
if(!in[i])q.push(i);
vector<int>topo;
while(!q.empty()){
int temp=q.front();q.pop();
topo.push_back(temp);
for(int i=0;i<g[temp].size();i++){
int u=g[temp][i];
if(--in[u]==0)q.push(u);
}
}
for(int i=topo.size()-1;i>=0;i--){
int x=topo[i];
f[x].reset(),f[x][x]=1;
for(int k=0;k<g[x].size();k++)
f[x]|=f[g[x][k]];
}
for(int i=1;i<=n;i++)
cout<<f[i].count()<<"\n";
}

浙公网安备 33010602011771号