二分图最大权匹配
二分图的最大权匹配是指二分图中边权和最大的匹配。
Hungarian Algorithm(Kuhn-Munkres Algorithm)
匈牙利算法又称为 KM 算法,可以在
考虑到二分图中两个集合中的点并不总是相同,为了能应用 KM 算法解决二分图的最大权匹配,需要先作如下处理:将两个集合中点数比较少的补点,使得两边点数相同,再将不存在的边权重设为
给每个节点
在一组可行顶标下原图的生成子图,包含所有点但只包含满足
证明 1.
考虑原二分图任意一组完美匹配
任意一组可行顶标的相等子图的完美匹配
即任意一组完美匹配的边权和都不会大于
有了定理 1,我们的目标就是透过不断的调整可行顶标,使得相等子图是完美匹配。
因为两边点数相等,假设点数为
首先初始化一组可行顶标,例如
然后选一个未匹配点,如同最大匹配一样求增广路。找到增广路就增广,否则,会得到一个交错树。
令
在相等子图中:
的边不存在,否则交错树会增长。 一定是非匹配边,否则他就属于 。
假设给
边依然存在相等子图中。 没变化。 中的 有所减少,可能加入相等子图。 中的 会增加,所以不可能加入相等子图。
所以这个
当一条新的边
是未匹配点,则找到增广路 和 中的点已经匹配
这样至多修改
每次修改顶标的时候,交错树中的边不会离开相等子图,那么我们直接维护这棵树。
我们对
所以可以在
交错树新增一个点进入
一开始枚举
Dynamic Hungarian Algorithm
原论文 The Dynamic Hungarian Algorithm for the Assignment Problem with Changing Costs
伪代码更清晰的论文 A Fast Dynamic Assignment Algorithm for Solving Resource Allocation Problems
相关 OJ 问题 DAP
- 修改单点
和所有 之间的权重,即权重矩阵中的一行- 修改顶标
- 删除
相关的匹配
- 修改顶标
- 修改所有
和单点 之间的权重,即权重矩阵中的一列- 修改顶标
- 删除
相关的匹配
- 修改顶标
- 修改单点
和单点 之间的权重,即权重矩阵中的单个元素- 做 1 或 2 两种操作之一即可
- 添加某一单点
,或者某一单点 ,即在权重矩阵中添加或者删除一行或者一列- 对应地做 1 或 2 即可,注意此处加点操作仅为加点,不额外设定权重值,新加点与其他点的权重为 0.
- 设原图为 G,左右两边的顶标为
和 ,可行顶标为 l,那 是 G 的一个子图,包含图 G 中满足 的点和边。 - 在上面匈牙利算法的部分,定理一证明了:对于某组可行顶标,如果其相等子图存在完美匹配,那么,该匹配就是原二分图的最大权完美匹配。
- 假设原来的最优匹配是
, 当一个修改发生的时候,我们会根据规则更新可行顶标,更新后的顶标设为 , 或者 ,会出现以下情况:- 权重矩阵的一整行被修改了,设被修改的行为
行,即 的所有边被修改了,所以 原来的顶标可能不满足条件,因为我们需要 ,但对于其他的 来说,除了 相关的边,他们的边权是不变的,因此他们的顶标都是合法的,所以算法中修改了 相关的顶标使得这组顶标是一组可行顶标。 - 权重矩阵的一整列被修改了,同理可得算法修改顶标使得这组顶标是一组可行顶标。
- 修改权重矩阵某一元素,任意修改其中一个顶标即可满足顶标条件
- 权重矩阵的一整行被修改了,设被修改的行为
- 每一次权重矩阵被修改,都关系到一个特定节点,这个节点可能是左边的也可能是右边的,因此我们直接记为
, 这个节点和某个节点 在原来的最优匹配中匹配上了。每一次修改操作,最多让这一对节点 unpair,因此我们只要跑一轮匈牙利算法中的搜索我们就能得到一个新的 match,而根据定理一,新跑出来的 match 是最优的。
以下代码应该为论文 2 作者提交的代码(以下代码为最大化权重版本,原始论文中为最小化 cost)
转化为费用流模型
在图中新增一个源点和一个汇点。
从源点向二分图的每个左部点连一条流量为
接下来对于二分图中每一条连接左部点
求这个网络的 最大费用最大流 即可得到答案。
习题
本页面最近更新:2/3/2023, 12:00:00 AM,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用