二分图匹配 (Bipartite Matching)
二分图匹配是组合数学中最具优雅特性的领域之一。本章将从 Berge 增广路定理出发,建立 Hall 婚姻定理的严密证明,并深入探讨二分图下的各种覆盖与独立集对偶性质。
一、 核心定理与形式化证明
1. Berge 增广路定理 (Berge's Lemma)
定理:匹配 是图 的最大匹配,当且仅当 中不存在关于 的增广路径。
2. Hall 婚姻定理 (Hall's Marriage Theorem)
定理:二分图 存在覆盖 的匹配,当且仅当对于 的任意子集 ,均满足 ,其中 是 的邻居集合。
二、 对偶性体系 (Kőnig's Theorem)
在二分图中,几个核心指标存在完美的对偶关系:
1. Kőnig 定理
定理:二分图中的最大匹配数 = 最小点覆盖数。
- 推论 1:最大独立集数 = 总顶点数 - 最小点覆盖数(最大匹配数)。
- 推论 2:最小边覆盖数 = 总顶点数 - 最大匹配数。
2. 最大权匹配:KM 算法 (Kuhn-Munkres)
KM 算法通过引入顶标 (Vertex Label) 将最大权匹配转化为相等子图下的完美匹配。
- 顶标性质:。
- 相等子图:仅包含满足 的边的子图。
三、 工业级 C++ 实现 (匈牙利算法)
/**
* @brief 匈牙利算法 (Hungarian Algorithm)
* 复杂度: O(VE)
*/
bool dfs(int u, vector<int>& match, vector<bool>& vis) {
for (int v : adj[u]) {
if (!vis[v]) {
vis[v] = true;
if (match[v] == -1 || dfs(match[v], match, vis)) {
match[v] = u;
return true;
}
}
}
return false;
}
int max_match(int n_left) {
int res = 0;
match.assign(n_right, -1);
for (int i = 0; i < n_left; ++i) {
vis.assign(n_right, false);
if (dfs(i, match, vis)) res++;
}
return res;
}
四、 精选练习与解析
练习 1:棋盘覆盖 - 骨牌铺满
给定 的棋盘,某些格子有障碍。求最多能放多少块 的骨牌。
Check Solution
解析:
- 二分图判定:棋盘是典型的二分图。
- 建模:相邻的非障碍格子连边。
- 求解:最大匹配数。
练习 2:最小路径点不相交覆盖
在 DAG 中找最少路径覆盖所有点。
Check Solution
解析: 见网络流章节练习 1。二分图匹配是其特殊且高效的解法。 最小路径数 = 总顶点数 - 最大匹配数。
练习 3:Hall 定理应用 - 循环赛判定
有 支队伍参加循环赛,已知每支队伍目前的得分及剩余比赛。判定是否可能使某支队伍 最终得分最高。
Check Solution
解析:
- 上限设定:设队伍 赢得所有剩余比赛,得分为 。
- 约束:其他队伍 最终得分不能超过 。
- 建模:
- 左侧节点:每场比赛 。
- 右侧节点:每支队伍 。
- 比赛 向队伍 和 连边,表示赢家。
- 求解:最大流是否等于剩余比赛总数。
练习 4:最大权完美匹配 - 任务分配
个人分配 个任务,已知每个人完成每个任务的效率。求总效率最大方案。
Check Solution
解析: 标准 KM 算法或费用流(流量设为 )。