1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| struct MaxMatch { int n, m, dis; vector<vector<int>> E; vector<int> nx, ny, dx, dy, vis;
MaxMatch(int n, int m) : n(n), m(m), dis(0), E(n), nx(n, -1), ny(m, -1), dx(n), dy(m), vis(m) {}
void add(int u, int v) { E[u].push_back(v); }
bool bfs() { dis = inf; fill(dx.begin(), dx.end(), -1); fill(dy.begin(), dy.end(), -1); queue<int> Q; for (int i = 0; i < n; ++i) { if (nx[i] == -1) Q.push(i), dx[i] = 0; } while (!Q.empty()) { int u = Q.front(); Q.pop(); if (dx[u] > dis) break; for (auto v : E[u]) { if (dy[v] == -1) { dy[v] = dx[u] + 1; if (ny[v] == -1) dis = dy[v]; else dx[ny[v]] = dy[v] + 1, Q.push(ny[v]); } } } return dis != inf; }
bool dfs(int u) { for (auto v : E[u]) { if (!vis[v] && dy[v] == dx[u] + 1) { vis[v] = true; if (ny[v] != -1 && dy[v] == dis) continue; if (ny[v] == -1 || dfs(ny[v])) { ny[v] = u; nx[u] = v; return true; } } } return false; }
int work() { int res = 0; while (bfs()) { fill(vis.begin(), vis.end(), false); for (int i = 0; i < n; ++i) { if (nx[i] == -1 && dfs(i)) ++res; } } return res; } };
int main() { int n, m, e; cin >> n >> m >> e; MaxMatch G(n, m); while (e--) { int u, v; cin >> u >> v; u--, v--; G.add(u, v); } cout << G.work() << "\n"; return 0; }
|