二分图最大权匹配


二分图的最大权匹配是指二分图中边权和最大的匹配。

Hungarian Algorithm(Kuhn-Munkres Algorithm)

匈牙利算法又称为 KM 算法,可以在 时间内求出二分图的 最大权完美匹配

考虑到二分图中两个集合中的点并不总是相同,为了能应用 KM 算法解决二分图的最大权匹配,需要先作如下处理:将两个集合中点数比较少的补点,使得两边点数相同,再将不存在的边权重设为 ,这种情况下,问题就转换成求 最大权完美匹配问题,从而能应用 KM 算法求解。

给每个节点 分配一个权值 ,对于所有边 满足

在一组可行顶标下原图的生成子图,包含所有点但只包含满足 的边

证明 1.

考虑原二分图任意一组完美匹配 ,其边权和为

任意一组可行顶标的相等子图的完美匹配 的边权和

即任意一组完美匹配的边权和都不会大于 ,那个 就是最大权匹配。

有了定理 1,我们的目标就是透过不断的调整可行顶标,使得相等子图是完美匹配。

因为两边点数相等,假设点数为 表示左边第 个点的顶标, 表示右边第 个点的顶标, 表示左边第 个点和右边第 个点之间的权重。

首先初始化一组可行顶标,例如

然后选一个未匹配点,如同最大匹配一样求增广路。找到增广路就增广,否则,会得到一个交错树。

表示二分图左边右边在交错树中的点, 表示不在交错树中的点。

bigraph-weight-match-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. 修改所有 和单点 之间的权重,即权重矩阵中的一列
    • 修改顶标
    • 删除 相关的匹配
  3. 修改单点 和单点 之间的权重,即权重矩阵中的单个元素
    • 做 1 或 2 两种操作之一即可
  4. 添加某一单点 ,或者某一单点 ,即在权重矩阵中添加或者删除一行或者一列
    • 对应地做 1 或 2 即可,注意此处加点操作仅为加点,不额外设定权重值,新加点与其他点的权重为 0.
  • 设原图为 G,左右两边的顶标为 ,可行顶标为 l,那 是 G 的一个子图,包含图 G 中满足 的点和边。
  • 在上面匈牙利算法的部分,定理一证明了:对于某组可行顶标,如果其相等子图存在完美匹配,那么,该匹配就是原二分图的最大权完美匹配。
  • 假设原来的最优匹配是 , 当一个修改发生的时候,我们会根据规则更新可行顶标,更新后的顶标设为 , 或者 ,会出现以下情况:
    1. 权重矩阵的一整行被修改了,设被修改的行为 行,即 的所有边被修改了,所以 原来的顶标可能不满足条件,因为我们需要 ,但对于其他的 来说,除了 相关的边,他们的边权是不变的,因此他们的顶标都是合法的,所以算法中修改了 相关的顶标使得这组顶标是一组可行顶标。
    2. 权重矩阵的一整列被修改了,同理可得算法修改顶标使得这组顶标是一组可行顶标。
    3. 修改权重矩阵某一元素,任意修改其中一个顶标即可满足顶标条件
  • 每一次权重矩阵被修改,都关系到一个特定节点,这个节点可能是左边的也可能是右边的,因此我们直接记为 , 这个节点和某个节点 在原来的最优匹配中匹配上了。每一次修改操作,最多让这一对节点 unpair,因此我们只要跑一轮匈牙利算法中的搜索我们就能得到一个新的 match,而根据定理一,新跑出来的 match 是最优的。

以下代码应该为论文 2 作者提交的代码(以下代码为最大化权重版本,原始论文中为最小化 cost)

转化为费用流模型

在图中新增一个源点和一个汇点。

从源点向二分图的每个左部点连一条流量为 ,费用为 的边,从二分图的每个右部点向汇点连一条流量为 ,费用为 的边。

接下来对于二分图中每一条连接左部点 和右部点 ,边权为 的边,则连一条从 ,流量为 ,费用为 的边。

求这个网络的

最大费用最大流 即可得到答案。

习题

贡献者:@Tifa@Yimin@mgt@Xeonacid

本页面最近更新:2/3/2023, 12:00:00 AM更新历史

发现错误?想一起完善? 在 GitHub 上编辑此页!

本页面的全部内容在 CC BY-SA 4.0SATA 协议之条款下提供,附加条款亦可能应用

评论

0 条评论
未登录用户


Copyright © 2016 - 2023 OI Wiki Team

最近更新:fd2ec2c, 2023-02-03

联系方式:Telegram 群组 / QQ 群组