一、为什么学二分图最大匹配?
Mermaid · 渲染中(下方为源码)
graph LR L[左部点] --> M[匈牙利增广] M --> R[右部点] L2[左部] -.匹配边.-> R2[右部]
把两组对象配对(任务↔工人、课程↔时间槽),求最多配对数。是网络流与图论的核心模型。
二、匈牙利算法(DFS 增广)
对每个左部点,尝试找"增广路"(未匹配→匹配交替到最后能扩成匹配的路)。
boolean dfs(int u) {
for (int v : g[u]) {
if (vis[v]) continue;
vis[v] = true;
if (match[v] == -1 || dfs(match[v])) {
match[v] = u; return true;
}
}
return false;
}
int hungarian() {
Arrays.fill(match, -1);
int ans = 0;
for (int u = 0; u < n; u++) {
Arrays.fill(vis, false);
if (dfs(u)) ans++;
}
return ans;
}三、带权匹配(KM 算法)
求最大权完美匹配,用顶标(标签) + 相等子图 + 松弛量调整,复杂度 O(n³)。
四、复杂度
| 项目 | 复杂度 |
|---|---|
| 匈牙利(无向二分图) |