AcWing 164. 可达性统计(拓扑排序+bitset优化)

Posted CCSU_Cola

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 164. 可达性统计(拓扑排序+bitset优化)相关的知识,希望对你有一定的参考价值。

AcWing 164. 可达性统计

链接: https://www.acwing.com/problem/content/166/

思路: 先拓扑排序得到图的拓扑序列,然后从拓扑序最后的开始更新,需要使用bitset更新可达点,因为需要除去重复的点,然后直接使用bitset的内置函数count一下1的数量即可。

#include <bits/stdc++.h>
using namespace std;
int d[30010];
int n,m;
vector<int>ve;
vector<int>w[30010];
bitset<30010>f[30010];
void topsort(){
    queue<int>ff;
    for(int i=1;i<=n;i++){
        if(!d[i]){
            ff.push(i);
        }
    }
    while(!ff.empty()){
        int t=ff.front();
        ff.pop();
        ve.push_back(t);
        int k=w[t].size();
        for(int i=0;i<k;i++){
            d[w[t][i]]--;
            if(d[w[t][i]]==0){
                ff.push(w[t][i]);
            }
        }
    }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        int a,b;
        scanf("%d%d",&a,&b);
        w[a].push_back(b);
        d[b]++;
    }
    topsort();
    for(int i=ve.size()-1;i>=0;i--){
        int t=ve[i];
        f[t][t]=1;
        int k=w[t].size();
        for(int j=0;j<k;j++){
            f[t]|=f[w[t][j]];
        }
    }
    for(int i=1;i<=n;i++){
        printf("%d\\n",f[i].count());
    }
    return 0;
}

以上是关于AcWing 164. 可达性统计(拓扑排序+bitset优化)的主要内容,如果未能解决你的问题,请参考以下文章

AcWing 164.可达性统计(图论+拓扑排序+位运算)

AcWing 164.可达性统计(图论+拓扑排序+位运算)

AcWing 164.可达性统计(图论+拓扑排序+位运算)

AcWing 164. 可达性统计 拓扑排序+状态压缩

AcWing:164. 可达性统计(拓扑排序 + 状态压缩算法)

AcWing 164. 可达性统计