代码里有较为详细的注释
#include<bits/stdc++.h>
using namespace std;
const int N=30010;
int n,m;
int h[N],e[N],ne[N],idx;//建图
bool st[N];
int deg[N];
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
deg[b]++;
}
int num[N];//存储每个点的可达数目,并且
bitset<N> s[N];//状态压缩的表示,二进制数组s[x]记录x可达哪些点
void topSort(int x){//dfs写法的拓扑序
st[x]=true;
s[x][x]=1;//自身肯定可达
for(int i=h[x];i!=-1;i=ne[i]){
int y=e[i];
if(!st[y]){
topSort(y);
}
s[x]|=s[y];//与其可达的点与其后继取|
}
num[x]=s[x].count();//记录答案即可
}
int main(){
memset(h,-1,sizeof h);
cin>>n>>m;
while(m--){//输入
int a,b;
cin>>a>>b;
add(a,b);
}
for(int i=1;i<=n;i++){//从每个入度为0的点出发进行dfs
if(deg[i]==0){
topSort(i);
}
}
for(int i=1;i<=n;i++) cout<<num[i]<<endl;
}