代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 100100, M = 500100;
struct node {
int to, next;
} e[M];
int h[N], idx, n, m;
int dfn[N], low[N], out[N], timetsma;
int stk[N], top;
void in(int &read) {
int x = 0, f = 1;
char ch;
for (ch = getchar(); (ch < '0' || ch > '9') && ch != '-'; ch = getchar());
if (ch == '-') {
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 3) + (x << 1) + ch - '0';
ch = getchar();
}
read = x * f;
}
bool st[1000001];
int id[N], cnt, s[N];
void add(int form, int to) {
e[++idx].next = h[form], e[idx].to = to;
h[form] = idx;
}
void tarjan(int u) {
dfn[u] = low[u] = ++timetsma;
stk[++top] = u, st[u] = 1;
for (int i = h[u]; i; i = e[i].next) {
int j = e[i].to;
if (!dfn[j]) {
tarjan(j);
low[u] = min(low[u], low[j]);
} else if (st[j]) {
low[u] = min(low[u], dfn[j]);
}
}
int y;
if (dfn[u] == low[u]) {
++cnt;
do {
y = stk[top--];
st[y] = 0;
id[y] = cnt;
s[cnt]++;
} while (y != u);
}
}
int main() {
in(n),in(m);
while (m--) {
int a, b;
in(a),in(b);
add(a, b);
}
for (int i = 1; i <= n; i++) {
if (!dfn[i]) {
tarjan(i);
}
}
for (register int i = 1; i <= n; i++) {
for (register int j = h[i]; j; j = e[i].next) {
int k = e[j].to;
int a = id[i], b = id[k];
if (a != b) out[a]++;
}
}
int k = 0;
for (register int i = 1; i <= cnt; i++) {
if (!out[i]) {
if (k) {
puts("0");
return 0;
}
k = i;
}
}
cout << s[k];
return 0;
}