二分图的最佳完美匹配——KM算法

本文介绍了如何使用KM算法解决二分图中寻找最佳完美匹配的问题,即最大化匹配边的权值之和。KM算法是匈牙利算法的贪心扩展,通过不断调整可行顶标值,确保相等子图中存在最佳完美匹配。算法流程包括初始化可行顶标、寻找相等子图的完备匹配、调整顶标并重复此过程,直至找到最佳完美匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分图的最佳完美匹配


如果二分图的每条边都有一个权(可以是负数),要求一种完备匹配方案,使得所有匹配边的权和最大,记做最佳完美匹配。(特殊的,当所有边的权为1时,就是最大完备匹配问题)
我们使用KM算法解决该问题。

KM(Kuhn and Munkres)算法,是对匈牙利算法的一种贪心扩展,如果对匈牙利算法还不够明白,建议先重新回顾一下匈牙利算法

KM是对匈牙利算法的一种贪心扩展,这种贪心不是对边的权值的贪心,算法发明者引入了一些新的概念,从而完成了这种扩展。

可行顶标


对于原图中的任意一个结点,给定一个函数 L ( n o d e ) L(node) L(node)求出结点的顶标值。我们用数组 l x ( x ) lx(x) lx(x)记录集合 X X X中的结点顶标值,用数组 l y ( y ) ly(y) ly(y)记录集合 Y Y Y中的结点顶标值。
并且,对于原图中任意一条边 e d g e ( x , y ) edge(x,y) edge(x,y),都满足 l x ( x ) + l y ( y ) > = w e i g h t ( x , y ) lx(x) + ly(y) >= weight(x,y) lx(x)+ly(y)>=weight(x,y)

相等子图


相等子图是原图的一个生成子图(生成子图即包含原图的所有结点,但是不包含所有的边),并且该生成子图中只包含满足 l x ( x ) + l y ( y ) = w e i g h t ( x , y ) lx(x) + ly(y) = weight(x,y) lx(x)+ly(y)=weight(x,y)的边,这样的边我们称之为可行边

算法原理

  • 定理:如果原图的一个相等子图中包含完备匹配,那么这个匹配就是原图的最佳二分图匹配。

  • 证明 :由于算法中一直保持顶标的可行性,所以任意一个匹配的权值之和肯定小于等于所有结点的顶标之和,则相等子图中的完备匹配肯定是最优匹配。

这就是为什么我们要引入可行顶标相等子图的概念。
上面的证明可能太过抽象,我们结合图示更直观的表述。

原图

该图表示原图,且 X = 1 , 2 , 3 , Y = 4 , 5 , 6 X = {1,2,3},Y = {4,5,6} X=1,2,3,Y=4,5,6,给出权值

w e i g h t ( 1 , 4 ) = 5 weight(1,4) = 5 weight(1,4)=5
w e i g h t ( 1 , 5 ) = 10 weight(1,5) = 10 weight(1,5)=10
w e i g h t ( 1 , 6 ) = 15 weight(1,6) = 15 weight(1,6)=15
w e i g h t ( 2 , 4 ) = 5 weight(2,4) = 5 weight(2,4)=5
w e i g h t ( 2 , 5 ) = 10 weight(2,5) = 10 weight(2,5)=10
w e i g h t ( 3 , 4 ) = 10 weight(3,4) = 10 weight(3,4)=10
w e i g h t ( 3 , 6 ) = 20 weight(3,6) = 20 weight(3,6)=20

对于原图的任意一个匹配 M M M

这里写图片描述

那么对于

e d g e ( 1 , 6 ) w e i g h t ( 1 , 6 ) = 15 edge(1,6) weight(1,6) = 15 edge(1,6)weight(1,6)=15
e d g e ( 2 , 5 ) w e i g h t ( 2 , 5 ) = 10 edge(2,5) weight(2,5) = 10 edge(2,5)weight(2,5)=10
e d g e ( 3 , 4 ) w e i g h t ( 3 , 4 ) = 10 edge(3,4) weight(3,4) = 10 edge(3,4)weight(3,4)=10

都满足 l x ( x ) + l y ( y ) > = w e i g h t ( x , y ) lx(x) + ly(y) >= weight(x,y) lx(x)+ly(y)>

KM算法,全称Kuhn-Munkres算法,是一种用于求解二分图最佳匹配算法。它可以找到一个匹配,使得两个集合内的所有顶点能够一一匹配,并且获得的权值最大或最小。KM算法在求解带权二分图匹配时,融合了匈牙利算法的思想。算法的步骤如下: 1. 初始化:将两个集合内的顶点分别标记为未被匹配状态。 2. 根据特定的规则,遍历第一个集合内的顶点。 3. 对于每个选中的顶点,遍历第二个集合内的顶点,找到与其相连的较优边。较优边的选择可以根据具体情况而定,可以是较大的权值或者较小的权值。 4. 如果找到了满足条件的边,判断该边对应的第二个顶点是否已经被匹配。如果该顶点还未被匹配,则直接将其与第一个顶点进行匹配。 5. 如果该顶点已经被匹配,但是与其匹配的顶点还可以找到其他的可匹配顶点,则将该顶点重新匹配给第一个顶点。 6. 循环执行步骤2-5,直到无法找到满足条件的边。 通过这样的循环匹配KM算法能够找到二分图最佳匹配。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [二分图的完全匹配---KM算法](https://blog.youkuaiyun.com/li13168690086/article/details/81557890)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值