欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

可达性统计(拓扑排序+bitset)

程序员文章站 2022-07-12 16:39:43
...
#include<bits/stdc++.h>
using namespace std;
const int N=30010;
bitset<N> b[N];
int n,m;
int deg[N];
int h[N],e[2*N],ne[2*N],idx;
void add(int a,int b){
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
vector<int> top(){
	vector<int> res;
	queue<int> q;
	for(int i=1;i<=n;i++)
		if(deg[i]==0){
			q.push(i);
			res.push_back(i);
		}
	while(q.size()){
		int t=q.front();
		q.pop();
		for(int i=h[t];i!=-1;i=ne[i]){
			int j=e[i];
			deg[j]--;
			if(deg[j]==0){
				res.push_back(j);
				q.push(j);
			}
		}
	}
	return res;
}
int main(){
	memset(h,-1,sizeof h);
	scanf("%d%d",&n,&m);
	for(int i=0;i<m;i++){
		int a,b;scanf("%d%d",&a,&b);
		add(a,b);
		deg[b]++;
	}
	vector<int> v;
	v=top();
	reverse(v.begin(),v.end());
	for(int i=0;i<v.size();i++){
		b[v[i]][v[i]]=1;
		for(int j=h[v[i]];j!=-1;j=ne[j]){
			int y=e[j];
			b[v[i]]|=b[y];
		}
	}
	for(int i=1;i<=n;i++){
		printf("%d\n",b[i].count());
	}
	return 0;
} 

 

相关标签: 算法进阶指南