对KM算法的理解

假设我们当前循环到了i1 ~ i1都找到了匹配,而i没有找到匹配,我们要一直找δ扩充交错树直到i找到了交错路我们才继续考虑i+1。设TAi+δ,Biδ之前的交错树,TAi+δ,Biδ之后的交错树,SAi+δ,Biδ之前的相等子图,SAi+δ,Biδ之后的相等子图

在第i个点找到增广路之前,每次都一定能够找到这么一个δ吗?是可以的

假设我们已经找不到这么一个δ了但是还是没有找到增广路。我们为什么会找不到这么一个δ?是因为原图中不存在满足iT,jT的边(i,j)了。我们考虑第i个点,这就说明与其关联的边(i,j)都已经被加入到相等子图中了(否则的话此时第i个点的交错树就不会包含这条边,因为这条边压根就没有被添加到相等子图中,而交错树的边肯定都是相等子图的边,也就是说原图中存在满足iT,jT的边(i,j));由于此时我们还没有找到增广路,也就是说对每条与i关联的边的另一个端点j都是匹配点(否则ij就是一条增广路),考虑每个j的匹配点matchj,对每个matchj来说,与其关联的边(matchj,k)也都已经被加入到相等子图中了(否则的话此时第i个点的交错树就不会包含这条边,因为这条边压根就没有被添加到相等子图中,而交错树的边肯定都是相等子图的边,也就是说原图中存在满足matchjT,kT的边(matchj,k));以此类推。然后考虑最终形成的这棵交错树是什么样子的呢?实际上就是我们将原图中所有的边都添加进这个相等子图中,然后第i个点跑出的交错树(因为与交错树中的左部节点关联的边全部被加入到了相等子图中)。然而,由于原图存在完备匹配,所以如果我们将原图中所有的边都添加进这个相等子图中,第i个点根本跑不出交错树,矛盾了,所以说明我们在第i个点找到增广路之前,一定能够找到这么一个δ

然后验证在Ai+δ,Biδ后,对原图(注意不是SS,是数据给出的所有边和所有点组成的原图)中的任意一条边仍然满足顶标不等式:如果这条边两端都在交错树或者都不在交错树中,那么仍然满足不等式;如果这条边的右部在交错树中但是左部不在,那么由于右部增加了一个δ而左部没变,所以这条边仍然满足不等式;如果这条边的左部在交错树中但是右部不在,由于我们找的δ是最小的,所以仍然满足不等式

也就是说如果我们每次都能找到这么一个δ,那么构建的新的相等子图S一定满足顶标不等式,也就说明P430的定理可以用

再来看看S有至少哪些边:

对于匹配边,其两端要么都在交错树中要么都不在交错树中,不可能出现一端在一端不在的情况,所以匹配边仍然在S

对于交错树上的边,显然每一条仍然在S

上面两种边是我们至少包含在S中的(S中的其他边就不用管了),故有TT的超集;而当所有满足iT,jT的边(i,j)加入到T中之后,根据我们上面的分析,一定是会找到交错路的

综上我们能在满足顶标不等式的前提下找到一个带权最大匹配

代码熟悉一下

posted @   最爱丁珰  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示