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
| using namespace std; const int MAXN = 505; const int INF = 0x3f3f3f3f;
int n, m, la[MAXN], lb[MAXN], sl[MAXN], match[MAXN], w[MAXN][MAXN], fa[MAXN], ans, re[MAXN]; bool vis[MAXN];
void bfs(int u) { memset(sl, 0x3f, sizeof(sl)); memset(vis, 0, sizeof(vis));
int pos = 0, x, p, delta;
for (match[pos] = u; match[pos]; pos = p) {
vis[pos] = 1, x = match[pos], delta = INF; for (int y = 1; y <= n; y++) { if (vis[y]) continue; if (la[x] + lb[y] - w[x][y] < sl[y]) { sl[y] = la[x] + lb[y] - w[x][y]; fa[y] = pos; } if (sl[y] < delta) { delta = sl[y]; p = y; } }
for (int y = 0; y <= n; y++) { if (vis[y]) la[match[y]] -= delta, lb[y] += delta; else sl[y] -= delta; }
}
for (; pos; pos = fa[pos]) match[pos] = match[fa[pos]];
}
void KM() { for (int i = 1; i <= n; i++) bfs(i); }
|