#include <bits/stdc++.h>
using namespace std;
#define MAXN 100001
#define MAXM 5*MAXN
int n, m, u, v, cnt, ssum, ans;
int dfn[MAXN], low[MAXN], scc[MAXN], siz[MAXN];
int us[MAXM], vs[MAXM];
vector<int> e[MAXN];
bitset<MAXN> ins, in;
stack<int> st;
queue<int> que;
void tarjan(int x){
low[x] = dfn[x] = ++cnt;
st.push(x);
ins.set(x);
for (auto i: e[x]){
if (!dfn[i]){
tarjan(i);
low[x] = min(low[x], low[i]);
}else if (ins.test(i)){
low[x] = min(low[x], dfn[i]);
}
}
if (dfn[x] == low[x]){
scc[x] = ++ssum;
++siz[ssum];
while (st.top() != x){
scc[st.top()] = ssum;
ins.reset(st.top());
st.pop();
++siz[ssum];
}
st.pop();
ins.reset(x);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i(1); i<=m; ++i){
cin >> u >> v;
e[u].push_back(v);
us[i] = u;
vs[i] = v;
}
for (int i(1); i<=n; ++i){
if (!dfn[i]) tarjan(i);
}
for (int i(1); i<=m; ++i){
u = scc[us[i]];
v = scc[vs[i]];
if (u != v) in.set(v);
}
for (int i(1); i<=ssum; ++i){
if (!in.test(i)){
if (ans){
cout << 0;
return 0;
}
ans = i;
}
}
cout << siz[ans];
return 0;
}
感觉和题解亿模亿样,找不到错误。