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优化)的主要内容,如果未能解决你的问题,请参考以下文章