P2341
记录: https://www.luogu.com.cn/record/190347110
#include<bits/stdc++.h>
using namespace std;
int dfn[50010],low[50010],n,m,head,top,fa[50010],mem[50010];
vector <int> line[50010];
stack <int> st;
bool vis[50010],online[50010],die[50010];
void dfs(int num)
{
st.push(num);
vis[num]=online[num]=true;
dfn[num]=low[num]=++head;
int len=line[num].size();
for(int i=0;i<len;i++)
{
int now=line[num][i];
if(dfn[now]==0)
{
dfs(now);
low[num]=min(low[num],low[now]);
}
else
{
if(online[now])
{
low[num]=min(low[num],low[now]);
}
}
}
if(dfn[num]==low[num])
{
top++;
int now;
do
{
now=st.top();
st.pop();
online[now]=false;
fa[now]=top;
mem[top]++;
}
while(now!=num);
}
return;
}
int main()
{
scanf("%d%d",&n,&m);
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
line[u].emplace_back(v);
}
for(int i=1;i<=n;i++)
{
if(vis[i]==false)
{
dfs(i);
}
}
for(int i=1;i<=n;i++)
{
int len=line[i].size();
for(int j=0;j<len;j++)
{
if(fa[line[i][j]]!=fa[i])
{
die[fa[i]]=true;
break;
}
}
}
int ans=0;
bool flag=false;
for(int i=1;i<=top;i++)
{
if(die[i]==false)
{
if(flag) return 0,putchar('0');
flag=true;
ans=mem[i];
}
}
printf("%d",ans);
}