#include<bits/stdc++.h>
using namespace std;
const int N=30010;
int n,m,d[N],ts[N],w=0;
vector<int>ed[N];
bitset<N>f[N];
void tops()
{
queue<int>q;
for(int i=1;i<=n;i++)
{
if(d[i]==0)q.push(i);
}
while(q.size())
{
int x=q.front();
q.pop();
ts[++w]=x;
for(int i=0;i<ed[x].size();i++)
{
int y=ed[x][i];
if(--d[y]==0)q.push(y);
}
}
}
int main()
{
cin>>n>>m;
int a,b;
memset(d,0,sizeof(d));
for(int i=1;i<=m;i++)
{
cin>>a>>b;
ed[a].push_back(b);
d[b]++;
}
tops();
for(int i=w;i>=1;i--)///从后向前推
{
int j=ts[i];
f[j][j]=1;
for(int k=0;k<ed[j].size();k++)
{
f[j]|=f[ed[j][k]];
}
}
for(int i=1;i<=n;i++)
cout<<f[i].count()<<endl;
return 0;
}
164. 可达性统计 二进制压缩+拓扑
最新推荐文章于 2024-04-04 01:09:44 发布