二分匹配——匈牙利算法和KM算法

一、二分图
定义:若把简单图G的顶点集分成两个不相交的非空集合V1和V2,使得图中每一条边都连接V1中的一个顶点和V2中的一个顶点(边的两个端点一个在V1中,另一个在V2中),则图G称为二分图,此时称(V1,V2)为G的顶点集的一个二部划分。

什么是简单图?
定义:图G的每条边都连接两个不同的顶点,且没有两条相同的边连接同一对顶点,则图 G 称为简单图。(没有多重边,没有一个顶点自身形成一个环)

二、判断一个图是否是二分图
定理:一个简单图是二分 图,当且仅当能够对图中任意相邻的两点赋予两种不同的颜色,使得没有一对相邻的顶点被赋予相同的颜色。(一个顶点只可能是两种颜色中的一种)

三、什么是匹配
一个匹配即是二分图中一个包含若干条边的集合,且其中任意两条边没有公共端点。所以一个二分图的匹配可以有多个。

四、最大匹配和完美匹配
1、顾名思义,在一个二分图的所有匹配中,包含边数最多的一个匹配就是最大匹配。
说到最大匹配,就顺便说一下最小点覆盖。因为最大匹配数 = 最小点覆盖
点覆盖的定义:图G=(V,E)中的一个点覆盖是一个集合S⊆V使得每一条边至少有一个端点在S中。
最小点覆盖顾名思义就是含最少元素的 S。

下面给出 最大匹配数 = 最小点覆盖 的证明(参考了其他博主的想法再结合自己的想法)

①最小点覆盖 <= 最大匹配数
若最大匹配数为 n ,则存在n条不相邻的边。取每一条边的一个端点,组成一个点集S,则最小点覆盖至少需要包含 |S|个点。

②最大匹配数 >= 最小点覆盖
对于最小点覆盖集S中的任一点,总有一条边连接该点与集合外的一点。若不存在这样的边,则所有以该点为端点的边同时有连接了S中的其他点,这样的话即使把该点从S中删去,得到原图的一个更小的点覆盖,这与S是最小点覆盖矛盾。所以对S中任一点v,存在一条连接v和不属于S的点w的边。对S中每一个v,都取这样一条边,构成一个边集E。下面证明E中每一条边都不相邻。若存在相邻的两条边,则存在v1、v2属于S且与S外同一点w相邻。由E的构成方式可知,在不属于S的点中,只有w与v1相邻,也只有w与v2相邻。有二分图的性质可知,在所有点中只有w与v1相邻,只有w与v2相邻,所以将S中的v1,v2删去,将w加入到S中,我们可以得到一个对于原图来说更小的点覆盖,这与S是最小点覆盖矛盾,所以E中每一条边都不相邻。所以E构成的了原图的一个匹配,所以最大匹配数 >= 最小点覆盖。

综上,最小点覆盖 == 最大匹配数。

2、若二分图的一个匹配为M,其划分为(V1,V2),若V1中每个顶点都是M中边的端点,即 |M| = |V1| (M中的边数等于V1的顶点数),则该匹配称为完美匹配。
所以,完美匹配一定是最大匹配,最大匹配不一定是完美匹配;且一个二分图肯定有最大匹配,但不一定有完美匹配。

五、最优匹配
最优匹配又称为带权最大匹配,是指在带有权值边的二分图中,求一个匹配使得匹配边上的权值和最大。一般求最优匹配时,所求二分图的划分(V1,V2)的顶点数相同,使得每一个顶点都需要被匹配,这样也就等同求出了完美匹配。如果V1和V2的顶点数不同,可以通过补点加权值0边实现转化,然后用KM算法解决。

说了那么多概念,接下来开始说算法了!!!

一、匈牙利算法——求二分图最大匹配

算法步骤:从一个未匹配的顶点出发,依次经过非匹配边、匹配边、非匹配边…形成一条路径,按此路径走找到第一个不同于起点的未匹配点V,则不再走下去。把起点和V的路径上的未匹配边都换成匹配边,已匹配边都换成未匹配边。重复这样,直到找不到这样的路径。

为什么这样就能得到最大匹配?
因为我们寻找的路径的起点和终点都是未匹配的点,且路径上的边是交替的,即是一条已经匹配的边和一条还未匹配的边交替存在。这样的话,这条路径上的未匹配边肯定比已经匹配的边多一(不清楚的话可以手动画一下)。将未匹配的边换成已经匹配的边,已经匹配的边换成未匹配的边,这样的话就形成一个比原匹配多一条边的匹配。当找不到这样一条路径时,我们就已经找到最大匹配了。
上述的路径称为增广路径。

这是我学习匈牙利算法时参考的博客,里面有图解

下面是匈牙利算法的DFS实现:
其中图的表示是用邻接表表示;我把算法封装成一个结构体


#include<vector>
using namespace 
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值