#include <iostream>
#include <cstdio>
#include <set>
#include <vector>
#include <stack>
#include <cmath>
using namespace std;
#define MX 50005
//图的基本信息
int n,m;
struct Node{
int dfn,low,gro;
int val,chudu;
};
Node point[MX];
vector <int> edge[MX];//原图
Node newpoint[MX];
vector <int> newedge[MX];//缩点后的新图
//tarjan
int dfn0,gro0;
stack <int> sta;
void divide_into_group()
{
int temp = sta.top();
sta.pop();
point[temp].gro = gro0;
newpoint[gro0].val++;
}
void tarjan(int now)
{
point[now].dfn = point[now].low = ++dfn0;
sta.push(now);
for (int nxt : edge[now])
{
if (point[nxt].dfn == 0)
{
tarjan(nxt);
point[now].low = min(point[nxt].low,point[now].low);
}
else
{
if (point[nxt].gro == 0)
{
point[now].low = min(point[nxt].dfn,point[now].low);
}
}
}
if (point[now].dfn == point[now].low)
{
gro0++;
while (sta.top() != now)
{
divide_into_group();
}
divide_into_group();
}
}
//缩点建新图
void suodian()
{
for (int i = 1;i <= n;i++)
{
for (int to : edge[i])
{
if (point[to].gro != point[i].gro)
{
newedge[point[i].gro].push_back(point[to].gro);
newpoint[point[i].gro].chudu++;
}
}
}
}
//读入
void read()
{
scanf("%d %d",&n,&m);
for (int i = 1;i <= m;i++)
{
int u,v;
scanf("%d %d",&u,&v);
edge[u].push_back(v);
}
}
//输出
int ans = 0;
void say()
{
for (int i = 1;i <= gro0;i++)
{
if (newpoint[i].chudu == 0)
{
if (ans != 0)
{
ans = 0;
return;
}
else
{
ans = newpoint[i].val;
}
}
}
printf("%d",ans);
}
int main()
{
read();
for (int i = 1;i <= n;i++)
{
if (point[i].gro == 0)
{
tarjan(i);
}
}
suodian();
say();
return 0;
}
求助