rt,,错的点都输出了 0,感觉少了 conner case
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 5;
int n, m;
vector<int> e[N];
int dfn[N], low[N], tim, scc_cnt;
bool ins[N];
stack<int> stk;
int siz[N], bel[N];
struct graph {
vector<int> g[N];
int in_deg[N], f[N];
int sum;
void addedge(int u, int v) {
g[u].push_back(v);
in_deg[v] ++;
}
void sol() {
queue<int> q;
for (int i = 1; i <= n; i ++) {
if (!in_deg[i]) {
q.push(i);
}
}
while (q.size()) {
int u = q.front();
q.pop();
sum --;
if (q.size()) {
f[u] = -1e9;
} else {
f[u] = sum;
}
for (auto v : g[u]) {
if (!-- in_deg[v]) {
q.push(v);
}
}
}
}
} G1, G2;
void tarjan(int u) {
dfn[u] = low[u] = ++ tim;
stk.push(u), ins[u] = true;
for (auto v : e[u]) {
if (!dfn[v]) {
tarjan(v);
low[u] = min(low[u], low[v]);
} else if (ins[v]) {
low[u] = min(low[u], dfn[v]);
}
}
if (dfn[u] == low[u]) {
int v;
scc_cnt ++;
do {
v = stk.top(), stk.pop();
ins[v] = false;
bel[v] = scc_cnt, siz[scc_cnt] ++;
} while (v != u);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cin >> n >> m;
for (int i = 1; i <= m; i ++) {
int u, v;
cin >> u >> v;
e[u].push_back(v);
}
for (int i = 1; i <= n; i ++) {
if (!dfn[i]) {
tarjan(i);
}
}
for (int u = 1; u <= n; u ++) {
for (auto v : e[u]) {
if (bel[u] == bel[v]) {
continue;
}
G1.addedge(bel[u], bel[v]);
G2.addedge(bel[v], bel[u]);
}
}
G1.sum = G2.sum = scc_cnt;
G1.sol(), G2.sol();
int ans = 0;
for (int i = 1; i <= scc_cnt; i ++) {
if (G1.f[i] + G2.f[i] == scc_cnt - 1) {
ans += siz[i];
}
}
cout << ans << "\n";
return 0;
}