调了一下午了
85pts
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 7;
int n, m, X[MAXN], Y[MAXN];
vector <int> G[MAXN];
void add(int from, int to) {
G[from].push_back(to);
}
int Low[MAXN], Dfn[MAXN], dfn;
bool V[MAXN];
int Scc[MAXN], scc, In[MAXN], ans;
stack<int> T;
void tarjan(int u) {
Low[u] = Dfn[u] = ++ dfn;
T.push(u); V[u] = true;
for (auto v : G[u]) {
if (! Dfn[v]) tarjan(v), Low[u] = min(Low[u], Low[v]);
else if (V[v]) Low[u] = min(Low[u], Low[v]);
}
if (Dfn[u] == Low[u]) {
Scc[u] = ++ scc;
while (! T.empty() && T.top() != u) V[T.top()] = 0, Scc[T.top()] = scc, T.pop();
T.pop(); V[u] = 0;
}
}
int main () {
cin >> n >> m;
for (int i = 1; i <= m; i ++) {
cin >> X[i] >> Y[i]; add(X[i], Y[i]);
}
for (int i = 1; i <= n; i ++)
if (!Dfn[i]) tarjan(i);
for (int i = 1; i <= m; i ++) {
int u = Scc[X[i]], v = Scc[Y[i]];
if (u != v) In[v] ++;
}
for (int i = 1; i <= scc; i ++) //有向无环图
if (!In[i]) ans ++;
cout << ans << '\n';
return 0;
}