#include #include #include using namespace std; int n, m; vector> g, rg; vector post, rs; vector done; void dfs1(int i){ if (done[i]) return; done[i] = true; for (int j : g[i]) dfs1(j); post.push_back(i); } bool dfs2(int r, int i){ if (rs[i] >= 0) return rs[i] != r; rs[i] = r; bool in = false; for (int j : rg[i]) in = dfs2(r, j) || in; return in; } int main(){ cin >> n >> m; g = vector>(n); rg = vector>(n); for (int i = 0; i < m; ++i){ int a, b; cin >> a >> b; a--; b--; g[a].push_back(b); rg[b].push_back(a); } post = vector(n); done = vector(n); for (int i = 0; i < n; ++i) dfs1(i); reverse(post.begin(), post.end()); rs = vector(n, -1); int count = 0; for (int i : post) if (rs[i] == -1) if (!dfs2(i, i)) ++count; cout << count << endl; }