二分图最大权匹配


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

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.0 和 SATA 协议之条款下提供,附加条款亦可能应用

评论

0 条评论
未登录用户


Copyright © 2016 - 2023 OI Wiki Team

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

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