胜利的奶牛
#include<bits/stdc++.h>
using namespace std;
const int N=10010;
int num[N],low[N],ins[N];
int belong[N],rings[N],stk[N];
int top,id,scc;
vector<int>e[N];
vector<int>e2[N];
unordered_set<int>st;
struct node{
int x,y;
}edge[N*5];
int deg[N],f[N];
void tarjar(int u,int fa){
id++;
num[u]=low[u]=id;
stk[++top]=u;
ins[u]=1;
for(int i=0;i<(int)e[u].size();i++){
int v=e[u][i];
if(num[v]==0){
tarjar(v,u);
low[u]=min(low[u],low[v]);
}
else if(ins[v]){
low[u]=min(low[u],num[v]);
}
}
if(num[u]==low[u]){
scc++;
while(top){
int v=stk[top--];
ins[v]=0;
belong[v]=scc;
rings[scc]++;
if(u==v)break;
}
}
}
int main(){
// freopen("1.txt","r",stdin);
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
if(x==y)continue;
e[x].push_back(y);
edge[i]={x,y};
}
for(int i=1;i<=n;i++){
if(num[i]==0)tarjar(i,0);
}
for(int i=1;i<=m;i++){
int u=belong[edge[i].x],v=belong[edge[i].y];
if(u==v)continue;
if(st.count(u*N+v))continue;
st.insert(u*N+v);
e2[u].push_back(v);
deg[v]++;
}
queue<int>h;
for(int i=1;i<=scc;i++){
if(deg[i]==0){
h.push(i);
}
f[i]=rings[i];
}
int res=0;
while(h.empty()==false){
int u=h.front();
if(f[u]==n){
res=rings[u];
}
h.pop();
for(int i=0;i<(int)e2[u].size();i++){
int v=e2[u][i];
deg[v]--;
f[v]+=f[u];
if(deg[v]==0){
h.push(v);
}
}
}
cout<<res;
return 0;
}