[ 二分图匹配 ] 匈牙利算法 和 KM算法 总结

本文介绍了二分图匹配的概念,包括最大匹配和最佳匹配,并详细解析了匈牙利算法(Kuhn-Munkres算法)的DFS和BFS实现。通过实例展示了这两种算法在寻找可增广链上的应用,最后提供了KM算法的代码实现。
摘要由CSDN通过智能技术生成

前言:

高中时候老师讲这个就听得迷迷糊糊,有一晚花了通宵看KM的Pascal代码,大概知道过程了,后来老师说不是重点,所以忘的差不多了。都知道二分图匹配是个难点,我这周花了些时间研究了一下这两个算法,总结一下


1. 基本概念

 

M代表匹配集合

 

未盖点:不与任何一条属于M的边相连的点

交错轨:属于M的边与不属于M的边交替出现的轨(链)

可增广轨:两端点是未盖点的交错轨

 

判断M是最大匹配的标准: M中不存在可增广轨

 

 

2. 最大匹配,匈牙利算法

 

时间复杂度:O(|V||E|)

原理:

寻找M的可增广轨P,P包含2k+1条边,其中k条属于M,k+1条不属于M。修改M为M&P。即 这条轨进行与M进行对称差分运算。

所谓对称差分运算,就是比如X和Y都是集合,X & Y=( X 并 Y ) - ( x 交 Y )

有一个定理是:M & P的边数是 |M|+1,因此对称差分运算扩大了M

 

实现:

关于这个实现,有DFS和BFS两种方法。先列出DFS的代码,带注释。这段代码来自中山大学的教材

核心部分在dfs(x),来寻找可增广轨。如果找到的话,在Hungarian()中,最大匹配数加一。这是用了刚才提到的定理。大家可以想想初始状态是什么,又是如何变化的

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值