|
| 1 | +const int MAXN1 = 50000; |
| 2 | +const int MAXN2 = 50000; |
| 3 | +const int MAXM = 150000; |
| 4 | + |
| 5 | +int n1, n2, edges, last[MAXN1], _prev[MAXM], head[MAXM]; |
| 6 | +int matching[MAXN2], dist[MAXN1], Q[MAXN1]; |
| 7 | +bool used[MAXN1], vis[MAXN1]; |
| 8 | + |
| 9 | +void init(int _n1, int _n2) |
| 10 | +{ |
| 11 | + n1 = _n1; |
| 12 | + n2 = _n2; |
| 13 | + edges = 0; |
| 14 | + fill(last, last + n1, -1); |
| 15 | +} |
| 16 | + |
| 17 | +void addEdge(int u, int v) |
| 18 | +{ |
| 19 | + head[edges] = v; |
| 20 | + _prev[edges] = last[u]; |
| 21 | + last[u] = edges++; |
| 22 | +} |
| 23 | + |
| 24 | +void bfs() |
| 25 | +{ |
| 26 | + fill(dist, dist + n1, -1); |
| 27 | + int sizeQ = 0; |
| 28 | + for (int u = 0; u < n1; ++u) |
| 29 | + { |
| 30 | + if (!used[u]) |
| 31 | + { |
| 32 | + Q[sizeQ++] = u; |
| 33 | + dist[u] = 0; |
| 34 | + } |
| 35 | + } |
| 36 | + for (int i = 0; i < sizeQ; i++) |
| 37 | + { |
| 38 | + int u1 = Q[i]; |
| 39 | + for (int e = last[u1]; e >= 0; e = _prev[e]) |
| 40 | + { |
| 41 | + int u2 = matching[head[e]]; |
| 42 | + if (u2 >= 0 && dist[u2] < 0) |
| 43 | + { |
| 44 | + dist[u2] = dist[u1] + 1; |
| 45 | + Q[sizeQ++] = u2; |
| 46 | + } |
| 47 | + } |
| 48 | + } |
| 49 | +} |
| 50 | + |
| 51 | +bool dfs(int u1) |
| 52 | +{ |
| 53 | + vis[u1] = true; |
| 54 | + for (int e = last[u1]; e >= 0; e = _prev[e]) |
| 55 | + { |
| 56 | + int v = head[e]; |
| 57 | + int u2 = matching[v]; |
| 58 | + if (u2 < 0 || !vis[u2] && dist[u2] == dist[u1] + 1 && dfs(u2)) |
| 59 | + { |
| 60 | + matching[v] = u1; |
| 61 | + used[u1] = true; |
| 62 | + return true; |
| 63 | + } |
| 64 | + } |
| 65 | + return false; |
| 66 | +} |
| 67 | + |
| 68 | +int maxMatching() |
| 69 | +{ |
| 70 | + fill(used, used + n1, false); |
| 71 | + fill(matching, matching + n2, -1); |
| 72 | + for (int res = 0;;) |
| 73 | + { |
| 74 | + bfs(); |
| 75 | + fill(vis, vis + n1, false); |
| 76 | + int f = 0; |
| 77 | + for (int u = 0; u < n1; ++u) |
| 78 | + if (!used[u] && dfs(u)) |
| 79 | + ++f; |
| 80 | + if (!f) |
| 81 | + return res; |
| 82 | + res += f; |
| 83 | + } |
| 84 | +} |
0 commit comments