#include using namespace std; vector match; vector seen; /*bool find(int j, const vector>& g) { if (match[j] == -1) return 1; seen[j] = 1; int di = match[j]; for (auto& e : g[di]) { if (!seen[e] && find(e, g)) { match[e] = di; return 1; } } return 0; } */ int dfs_matching(vector>& g, int n, int m) { /*match.assign(m, -1); for (int i = 0; i < n; i++) { seen.assign(m, 0); for (auto& j : g[i]) if (find(j, g)) { match[j] = i; break; } } return m - (int)count(match.begin(), match.end(), -1);*/ vector> graf(n+m); for (int i = 0; i < n; i++) for (int j : g[i]) { graf[i].push_back(j+n); graf[j+n].push_back(i); } vector visited(n+m); int ans = 0; for (int i = 0; i < n+m; i++) if (!visited[i]) { int va=0, vb=0; stack s; s.push(i); while (!s.empty()) { int x = s.top(); s.pop(); if (visited[x]) continue; visited[x] = true; if (x> n >> m; vector> graf(n), reg(n); for (int i = 0; i < m; i++) { int x, y; cin >> x >> y; x--; y--; graf[x].push_back(y); reg[y].push_back(x); } int start; for (int i = 0; i < n; i++) if (reg[i].size() == 0) start=i; unordered_map S, M; S[start] = 0; vector in(n); for (int i = 0; i < n; i++) in[i] = reg[i].size(); int ans = 0; while (true) { //for (auto p : S) cout << p.first << ' '; cout << endl; int I = 0; for (auto p : S) for (int j : graf[p.first]) { in[j]--; if (in[j] == 0) { // cout<> g(S.size()); for (auto p : S) for (int j : graf[p.first]) if (M.find(j) != M.end()) g[p.second].push_back(M[j]); ans += dfs_matching(g, S.size(), M.size()); //cout << ans << endl; S = M; M = unordered_map(); } cout << m-ans << endl; }