染色法判别二分图
二分图最大匹配(匈牙利算法 O(nm))
#include <bits/stdc++.h>using namespace std;const int N = 505, M = 1e5+5;int n1, n2, m, idx;int h[N], e[M], ne[M];int match[N];bool st[N];void add(int a, int b) {e[idx] = b;ne[idx] = h[a];h[a] = idx++;}bool find(int x) {for (int i = h[x]; i != -1; i = ne[i]) {int j = e[i];if (!st[j]) {st[j] = 1;if (!match[j] || find(match[j])) {match[j] = x;return 1;}}}return 0;}signed main() {scanf("%d%d%d", &n1, &n2, &m);memset(h, -1, sizeof h);for (int i = 1; i <= m; i++) {int u, v;scanf("%d%d", &u, &v);add(u, v);}int ans = 0;for (int i = 1; i <= n1; i++) {memset(st, 0, sizeof st);if (find(i))ans++;}cout << ans << '\n';return 0;}
