一般图最大匹配
带花树算法(Blossom Algorithm)
开花算法(Blossom Algorithm,也被称做带花树)可以解决一般图最大匹配问题(maximum cardinality matchings)。此算法由 Jack Edmonds 在 1961 年提出。 经过一些修改后也可以解决一般图最大权匹配问题。 此算法是第一个给出证明说最大匹配有多项式复杂度。
一般图匹配和二分图匹配(bipartite matching)不同的是,图可能存在奇环。
以此图为例,若直接取反(匹配边和未匹配边对调),会使得取反后的
下面考虑一般图的增广算法。 从二分图的角度出发,每次枚举一个未匹配点,设出发点为根,标记为 "o",接下来交错标记 "o" 和 "i",不难发现 "i" 到 "o" 这段边是匹配边。
假设当前点是
case 1:
case 2:
遇到偶环的情况,将他视为二分图解决,故可忽略。缩花 后,再新图中继续找增广路。
设原图为
- 若
存在增广路, 也存在。 - 若
存在增广路, 也存在。
设非树边(形成环的那条边)为
观察可知,从环外的边出去有两种情况,顺时针或逆时针。
于是 缩花 与 不缩花 都不影响正确性。
实作上找到 花 以后我们不需要真的 缩花,可以用数组纪录每个点在以哪个点为根的那朵花中。
复杂度分析 Complexity Analysis
每次找增广路,遍历所有边,遇到 花 会维护 花 上的点,
代码
习题
本页面最近更新:2/3/2023, 12:00:00 AM,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用