二分图的匹配问题以及求解算法

本文介绍了二分图的概念及其在解决匹配问题中的应用,特别是在解决婚姻匹配问题上的直观例子。二分图的最大匹配和完美匹配被讨论,其中完美匹配是最大匹配的特殊情况。接着,通过一个具体的实例详细阐述了匈牙利算法的步骤,并验证了其正确性。文章最后提到了匈牙利算法在寻找最大匹配问题上的有效性。

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

概念

二分图:二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V被分割为两个互不相交的顶点子集(A,B),并且边集E中的每条边(vi,vj)所关联的两个顶点vi和vj分别属于这两个不同的顶点集(比如vi in A,vj in B或者vi in B,vj in A),则称图G为一个二分图。

举例如下:
在这里插入图片描述
我们发现,A内部的顶点之间是没有边的,B也是,只有A,B相互之间连接,这就是二分图。

问题定义

在介绍二分图的匹配问题之前,先看个直观的例子。
把上面给的这幅图想象成结婚问题,其中B代表男生,A代表女生。连线表示这个男生的心动女生(可能有多个)。现在问存不存在一种方案使得B中的所有男生都能够和自己的心动女生结婚?如果不存在,那么B中最多可以有几个男生和他们的心动女生结婚?

在上述的二分图中,是可以的,如下面的箭头所示,每一个B中的男生都找到了自己的配偶。
在这里插入图片描述
下面正式引出一般性地二分图的匹配问题,

二分图的匹配问题:给定一个二分图,问最大匹配是多少?

例如,上面这个二分图的最大匹配是4。

其他概念:

  1. 匹配:匹配是边的集合,在该集合中,任意两条边不能有共同的顶点。否则岂不是一个人同时结两个婚。
  2. 完美匹配:完美匹配是集合A和集合B的双射。上述例子中不存在完美匹配,因为女生多了一个,最多只有4对鸳鸯,注定有一个女生要寂寞空虚冷。

我们可以发现:完美匹配一定是最大匹配,但是最大匹配不一定是完美匹配。上面的例子就说明了这么一点。

那我们的算法要求解最大匹配还是求完美匹配?当然是最大匹配,因为最大匹配总是存在的,而完美匹配不一定存在。另外,求得了最大匹配,再来判断这个最大匹配是不是完美匹配太简单了,看是不是所有人都结婚了即可。

求解算法-匈牙利算法

匈牙利算法的英文名称是:Hungary,也是匈牙利国家的名字,太逗了。
我们给个例子,跟着匈牙利算法走一遍流程就什么都懂了。给定一个二部图如下:
在这里插入图片描述
我们以上面的 x x x为基准,从左边开始依次找配对,所以我们先为 x 1 x_1 x1找配对。第一条边是 ( x 1 , y 1 ) (x_1,y_1) (x1,y1),标记!
在这里插入图片描述
在没有遇到冲突之前,我们都这样做:
在这里插入图片描述
这个时候冲突了, x 3 x_3 x3的第一个是 y 1 y_1 y1,虽然他可以去跟 y 7 y_7 y7匹配,但是我们希望把这个 y 7 y_7 y7机会留给后人,先看看与 y 1 y_1 y1配对的那位兄弟 x 1 x_1 x1能否腾个位置出来。发现还是不可以,因为 ( x 1 , y 2 ) (x_1,y_2) (x1,y2) y 2 y_2 y2 x 2 x_2 x2占了,所以希望老哥 x 2 x_2 x2腾个位置,终于可以了,找到了 y 5 y_5 y5,从而如下:
在这里插入图片描述
然后继续往下做,下次开始对 x 4 x_4 x4进行匹配,就这样下去…。
在这里插入图片描述
这个时候,匹配 x 6 x_6 x6的时候,发现 y 4 y_4 y4被人占了,被 x 5 x_5 x5占了,而 x 5 x_5 x5只能匹配它,腾不出位置来了,所以 x 6 x_6 x6只有一个单着了。
其实,到这里,我们发现,即使 x 5 x_5 x5 y 4 y_4 y4让给 x 6 x_6 x6,最大匹配数还是和之前一样,保持不变,这初步验证了匈牙利算法的正确性,但是仍然不严格。

下面给出匈牙利算法的证明。

参考资料:
https://blog.csdn.net/smartxxyx/article/details/9275177
https://blog.csdn.net/Dark_Scope/article/details/8880547?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
https://blog.csdn.net/u013384984/article/details/90718287

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

音程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值