只是模板。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <stack>
#define M 50000
using namespace std;
int a[M],b[M],num,next[M],p[M],n,m,e,dfn[M],index,low[M];
int top,instack[M],flag[M],belong[M],Flag,out[M],judge,ans;
stack<int>sta;
void make(int aa,int bb)
{
num++;
a[num]=aa;
b[num]=bb;
next[num]=p[aa];
p[aa]=num;
}
void trajan(int u)
{
++index;
low[u]=index;
dfn[u]=index;
sta.push(u);
instack[u]=1;
flag[u]=1;
int edge=p[u];
while(edge>0)
{
int k=b[edge];
if(!flag[k])
{
trajan(k);
low[u]=min(low[u],low[k]);
}
else
if(instack[k])
low[u]=min(low[u],dfn[k]);
edge=next[edge];
}
if(low[u]==dfn[u])
{
int j=0;Flag++;
while(j!=u)
{
j=sta.top();
sta.pop();
instack[j]=0;
belong[j]=Flag;
}
}
}
int main()
{
scanf("%d%d",&n,&e);
for(int i=1;i<=e;i++)
{ int x,y;
scanf("%d%d",&x,&y);
make(x,y);
}
for(int i=1;i<=n;i++)
{
if(!dfn[i])
trajan(i);
}
if(Flag==1)
printf("%d",n);
else
{
int fans=0,ans,sum=0;
for(int i=1;i<=num;i++)
if(belong[a[i]]!=belong[b[i]])
out[belong[a[i]]]++;
for(int i=1;i<=Flag;i++)
{ if(out[i])
fans++;
else
ans=i;
}
if(fans==Flag-1)
{
for(int i=1;i<=n;i++)
if(belong[i]==ans)
sum++;
printf("%d",sum);
}
else
printf("0");
}
return 0;
}