POJ 2186
#include<cstdio>
#include<algorithm>
#define maxn 100005
using namespace std;
int n,m;
int siz[maxn];
int info[maxn],Prev[maxn<<1],to[maxn<<1],cnt_e;
inline void Node(int u,int v){ Prev[++cnt_e]=info[u],info[u]=cnt_e,to[cnt_e]=v; }
int dfn[maxn],low[maxn],tot,c[maxn],scc,q[maxn],tp,ot[maxn];
void dfs(int now)
{
dfn[now] = low[now] = ++tot;
q[tp++] = now;
for(int i=info[now];i;i=Prev[i])
if(!dfn[to[i]]) dfs(to[i]),low[now]=min(low[to[i]],low[now]);
else if(!c[to[i]]) low[now]=min(low[now],dfn[to[i]]);
if(low[now] == dfn[now])
{
scc++;
for(;tp && q[tp]!=now;)
c[q[--tp]] = scc , siz[scc]++;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1,u,v;i<=m;i++) scanf("%d%d",&u,&v),Node(u,v);
for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i);
for(int i=1;i<=n;i++)
for(int j=info[i];j;j=Prev[j])
if(c[to[j]]!=c[i])
ot[c[i]]++;
int pt=0;
for(int i=1;i<=scc;i++) if(!ot[i])
{
if(pt){ puts("0");return 0; }
pt = i;
}
printf("%d\n",siz[pt]);
}