上一篇博客 稳定匹配问题 - Gale & Shapley 我们介绍了稳定匹配的问题和Gale-Shapley
算法, 这次我们尝试用二分图和匈牙利算法来解决问题.
二分图相关概念
首先了解一下二分图的相关概念, 假设有一个图G(V, E), V为顶点集合, 分为X和Y, 分别代表男人和女人, E为边集合, 边的两端分别在X和Y集合中.
我们规定G的子图Gs的边集合任意两条都不是同一顶点, 则Gs是一个匹配. 如图所示:
如果加上黑色边表示男女互相喜欢, 如下:
绿色边表示配对的结果, 称为匹配边, 其他称为非匹配边.
当匹配边最多时, 则称为该图的最大匹配.
接着介绍匈牙利算法.
匈牙利算法
接着是了解匈牙利算法, 在此之前, 我们先要知道几个概念:
增广路
(augmenting path):
从一个未匹配的点出发, 通过交替路
(依次经过非匹配边、匹配边、非匹配边...依次交替的路径), 若途径其他未匹配点, 那么称为该交替路为增广路.
增广路有一个重要特点:非匹配边比匹配边多一条。所以取反(把增广路中的匹配边和非匹配边的身份交换)之后, 匹配边就比非匹配边多一条, 如此不断寻找增广路, 知道找不到增广路径时, 算法就结束了, 得到的就是最大匹配. 匈牙利算法就是这么做的.
算法实现
实现主要用到两个类: MatchRecord
和HungaryAlgorithm
.
MatchRecord
作为匹配过程的辅助记录, 比如边和点的关系/增广路等等, 如注释:
|
HungaryAlgorithm
, 主要是执行匹配过程, 通过深度搜索来查找匹配:
|
最终输出结果:
匹配结果: |
最后
以上就是匈牙利算法, 不过上面我们解决的仍是无权匹配的问题, 下篇博客我们将讨论有权匹配的问题和相关算法.
参考
匈牙利算法
图论(匹配)
https://www.renfei.org/blog/bipartite-matching.html