可达性统计

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

输入格式

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

输出格式

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

数据范围

1N,M300001≤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";
}

  

 
posted @ 2021-05-07 20:49  Acception  阅读(127)  评论(0)    收藏  举报