二分图的最大匹配问题(匈牙利算法)

本文介绍了二分图的概念及其匹配理论,并重点探讨了最大匹配和匈牙利算法。匈牙利算法通过寻找交错路来不断优化匹配数,最终得到最大匹配。算法复杂度为O(VE),适用于求解二分图的最大匹配问题。

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

最近在研究二分图问题,有很多东东还是不熟悉!边学习边完善!

【二分图】图中的顶点可以分为两个不相交的点集u和v,因此,二分图中的每个边都是u中的一个点连接v中的一个点。因为u与v不相交,所以图中不存在环。

【二分图的匹配】给定一个二分图G,M为G边集的一个子集,如果M满足当中的任意两条边都不依附于同一个顶点,则称M是一个匹配。

【二分图的最大匹配】包含边数最多的匹配就是最大匹配。(比如,一个二分图中有三个匹配,即经过求最大匹配算法计算后有三个匹配,那么这个二分图的最大匹配数就是3)

【匈牙利算法】计算最大匹配的一种算法:

算法的理论基础:一个匹配为最大匹配当且仅当匹配中不存在交错路。(所以二分图的求解过程就是一个消除交错路的过程)

交错路:这样的一条路径,在二分图中,它的起点和终点都是都是未匹配的点,它的路径经过的一条连线是一条没被匹配的、一条已经匹配过的,这样交替的出现。也称增广路。

算法过程:将图左边的点逐个与右边的点进行检查,如果右边的点没有匹配过,那么就将它和左边这个点匹配,匹配数加1:如果匹配过但该点存在于一条交错路中(增广路),显然路径里没被匹配的连线比已经匹配了的连线多一条,于是修改匹配图,把路径里所有匹配过的连线去掉匹配关系,把没有匹配的连线变成匹配的,这样匹配数就比原来多1个。不断执行上述操作,直到找不到交错路(增广路径)为止。这时,就得到了最大的匹配数。

PS:

匈牙利算法只需要以每个节点为起点找一次增广路即可求得最大匹配,寻找增广路的复杂度为O(E),总的复杂度为O(VE)

用c/c++语言描述一下匈牙利算法的过程!

程序中涉及的变量说明:n为二分图的左部分顶点个数(顶点标号1-n)、m为二分图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值