二分图的最大匹配—匈牙利算法

匈牙利算法求二分图的最大匹配 二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。 二分图的最大匹配: 匈牙利算法  完美匹配: 如果所有点都在匹配边上,称这个最大匹配是完美匹配。  最小覆盖: 最小覆盖要求用最少 阅读详情

【基本概念】:

二分图:

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

无向图G为二分图的充分必要条件是,G至少有两个顶点,且其所有回路的长度均为偶数。

最大匹配:

给定一个二分图G,在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点,则称M是一个匹配.  选择这样的边数最大的子集称为图的最大匹配问题,如果一个匹配中,图中的每个顶点都和图中某条边相关联,则称此匹配为完全匹配,也称作完备匹配.

最小覆盖:

最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和其中一个点关联。可以证明:最少的点(即覆盖数)=最大匹配数

最小路径覆盖:

用尽量少的不相交简单路径覆盖有向无环图G的所有结点。解决此类问题可以建立一个二分图模型。把所有顶点i拆成两个:X结点集中的i和Y结点集中的i',如果有边i->j,则在二分图中引入边i->j',设二分图最大匹配为m,则结果就是n-m。

增广路(增广轨):

若P是图G中一条连通两个未匹配顶点的路径,并且属于M的边和不属于M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径(举例来说,有A、B集合,增广路由A中一个点通向B中一个点,再由B中这个点通向A中一个点……交替进行)。

增广路径的性质:

1 有奇数条边。

2 起点在二分图的左半边,终点在右半边。

3 路径上的点一定是一个在左半边,一个在右半边,交替出现。(其实二分图的性质就决定了这一点,因为二分图同一边的点之间没有边相连,不要忘记哦。)

4 整条路径上没有重复的点。

5 起点和终点都是目前还没有配对的点,而其它所有点都是已经配好对的。

6 路径上的所有第奇数条边都不在原匹配中,所有第偶数条边都出现在原匹配中。

7 最后,也是最重要的一条,把增广路径上的所有第奇数条边加入到原匹配中去,并把增广路径中的所有第偶数条边从原匹配中删除(这个操作称为增广路径的取反),则新的匹配数就比原匹配数增加了1个。

了 解了增广路的定义以及性质之后,我们仔细理解第7条性质。因为增广路径的长度为奇数,我们不妨设为2*K+1,又因为第一条是非匹配边,且匹配边与非匹配 边交替出现,所以非匹配边有K+1条,匹配边有K条。此时,我们做取反操作,则匹配边的个数会在原来的基础上+1。求最大匹配的“匈牙利算法”即是此思 想:无论从哪个匹配开始,每一次操作都让匹配数+1,不断扩充,直到找不到增广路径,此时便得到最大匹配。

匈牙利算法:

算法的核心就是根据一个初始匹配不停的找增广路,直到没有增广路为止。

匈牙利算法的本质实际上和基于增广路特性的最大流算法还是相似的,只需要注意两点:

(一)每个X节点都最多做一次增广路的起点;

(二)如果一个Y节点已经匹配了,那么增广路到这儿的时候唯一的路径是走到Y节点的匹配点(可以回忆最大流算法中的后向边,这个时候后向边是可以增流的)。

找增广路的时候既可以采用dfs也可以采用bfs,两者都可以保证O(nm)的复杂度,因为每找一条增广路的复杂度是O(m),而最多增广n次,dfs在实际实现中更加简短。

匈牙利算法的基本模式:

1、 初始时最大匹配为空

2、 while (找得到增广路径)

3、 do  把增广路径加入到最大匹配中。

如果二分图的左半边一共有n个点,最多找n条增广路径,如果图中有m条边,每一条增广路径把所有边遍历一遍,所以时间复杂度为O(n*m);

算法思想:

算 法的思路是不停的找增广轨, 并增加匹配的个数,增广轨顾名思义是指一条可以使匹配数变多的路径,在匹配问题中,增广轨的表现形式是一条"交错轨",也就 是说这条由图的边组成的路径, 它的第一条边是目前还没有参与匹配的,第二条边参与了匹配,第三条边没有..最后一条边没有参与匹配,并且始点和终点还没 有被选择过.这样交错进行,显然 他有奇数条边.那么对于这样一条路径,我们可以将第一条边改为已匹配,第二条边改为未匹配...以此类推.也就是将所有 的边进行"反色",容易发现这样修 改以后,匹配仍然是合法的,但是匹配数增加了一对.另外,单独的一条连接两个未匹配点的边显然也是交错轨.可以证明, 当不能再找到增广轨时,就得到了一个 最大匹配.这也就是匈牙利算法的思路.、

二分图匹配中较为重要的三个公式:

二分图最小顶点覆盖 = 二分图最大匹配;

DAG图的最小路径覆盖 = 节点数(n)- 最大匹配数;

二分图最大独立集 = 节点数(n)- 最大匹配数;

 #include <iostream>

#include <cstdio>

#include <cstring>

using namespace std;

const int N=1001;

int n1,n2,k;

//n1,n2为二分图的顶点集,其中x∈n1,y∈n2

int map[N][N],vis[N],link[N];

//link记录n2中的点y在n1中所匹配的x点的编号

int find(int x)

{

int i;

for(i=1;i<=n2;i++)

{

if(map[x][i]&&!vis[i])//x->i有边,且节点i未被搜索

{

vis[i]=1;//标记节点已被搜索

//如果i不属于前一个匹配M或被i匹配到的节点可以寻找到增广路

if(link[i]==0||find(link[i]))

{

link[i]=x;//更新

return 1;//匹配成功

}

}

}

return 0;

}

int main()

{

int i,x,y,s=0;

scanf("%d%d%d",&n1,&n2,&k);

for(i=0;i<k;i++)

{

scanf("%d%d",&x,&y);

map[x][y]=1;

}

for(i=1;i<=n1;i++)

{

memset(vis,0,sizeof(vis));

if(find(i))

s++;

}

printf("%d\n",s);

return 0;

}


二分图相关概念及匈牙利算法求解最大匹配(附代码实现) “匈牙利算法”最早是由匈牙利数学家D.Koning用来求矩阵中0元素的个数的一种方法,由此他证明了“矩阵中独立0元素的最多个数等于能覆盖所有0元素的最少直线数”。1955年由W.W.Kuhn在求解著名的指派问题时引用了这一结论, 并对具体算法做了改进,仍然称为“匈牙利算法”。图论中相关概念二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。准确地说:把一个图 阅读详情

相关推荐

Java农产品质量溯源大数据管理系统源码

产品追溯基于“一物一码”从工厂生产环节至销售阶段,赋予产品唯一的数码,并关联产品名称、批号、生产时间等信息,建立包装关联关系,为后期产品的追溯、营销搭建信息基础。 农产品溯源,从原材料收购、生产、加工质检到包装运输、终端门店销售等环节追溯,可以保证产品质量,监管部门和消费者都可以查询产品信息。对生产进行层层把关、一旦发现问题、立即进行处理、提升产品质量。

xingchen优快云的博客 1806

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

二分图最大匹配(一)、二分图的介绍1、定义2、充要条件(二)、二分图的匹配1、二分图的最大匹配2、增广路径3、匈牙利算法(1)、复杂度 (一)、二分图的介绍 1、定义 二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点 i 和 j 分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。 2、充要条件 无向图G为二分图的充分必要条件是,G至少有两个顶点,且其所有回路的

hahahahahaha5的博客 1万+

从零开始:如何用Python手绘波特图并分析电路稳定性

本文详细介绍了如何使用Python绘制波特图并分析电路稳定性,涵盖从基础理论到实际应用的完整流程。通过NumPy和Matplotlib实现频域分析,包括RC低通滤波器和RLC带通滤波器的案例,以及相位裕度计算等高级技巧,为电子工程师提供了一套高效的电路分析解决方案。

hhh00的博客 374

二分图的最大匹配——匈牙利算法

二分图简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。 也就是说,把一个图的顶点划分为两个不相交集 XX 和 YY ,使得每一条边都分别连接XX 、YY 中的顶点。如果存在这样的划分,则此图为一个二分图。二分图的一个等价定义是:不含有「奇数条边的环」的图。图11不含有「奇数条边的环」我们习惯上将其画成下列形式:可以看到图22中每条边的两个端点属于不同的集合

六天 1万+

主流双目相机技术参数横向评测:从ZED到INDEMIND的深度解析

本文对主流双目相机进行了深度横向评测,涵盖ZED、Bumblebee、Leap Motion、DUO 3D及INDEMIND等国内外产品。文章详细解析了分辨率、帧率、视场角、基线等核心参数,并结合科研、机器人导航、无人机、工业检测等典型应用场景,提供了实战选型指南,帮助读者根据具体需求挑选最合适的双目视觉解决方案。

weixin_29212867的博客 641

VTK四视图联动避坑指南:解决vtkImagePlaneWidget窗宽窗位同步与切片序号更新的那些坑

本文详细解析了VTK四视图联动开发中的关键技术点与常见问题,包括切片位置同步、窗宽窗位同步的实现原理及回调机制设计。针对开发中遇到的回调事件不触发、渲染性能低下等问题,提供了实用的解决方案和优化技巧,帮助开发者高效构建医学影像和科学可视化应用。

weixin_42638178的博客 392

二分图的最大匹配、完美匹配和匈牙利算法

这篇文章讲无权二分图(unweighted bipartite graph)的最大匹配(maximum matching)和完美匹配(perfect matching),以及用于求解匹配的匈牙利算法(Hungarian Algorithm);不讲带权二分图的最佳匹配。 1. 二分图的基本知识点 二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。准确地说:把一个图的顶点划分为两个不相交集 $U$ 和$V$ ,使得每一条边都分别连接$U$、$V$中的顶点。如果存在

开源节流 2万+

C语言入门系列:指针入门(超详细)

指针与内存是息息相关的,在学习指针之前,先回忆下内存相关的知识。内存是程序运行期间存储数据的硬件设备,为了方便管理,计算机将内存划分为一个个小的单元,每个单元的大小是一个字节。如果把内存比作一栋酒店大楼,内存单元就像是一个个小的房间,数据就住在小房间里。我们知道,为了客人能准确找到属于自己的房间,酒店房间是有房号的。同样,内存单元也是有编号的,这个编号在计算机中称之为“内存地址。

epitomizelu的专栏 3696

二分图最大匹配——匈牙利算法详解

贵圈真乱(

EQUINOX1的博客 3481

手把手教您同花顺如何设置大盘分时均价线

本文将手把手教你如何在同花顺PC端开启大盘指数分时图📈

XiaoqiangClub的博客 4429

在MATLAB和Simulink中设计并仿真一个电动汽车整车动力学模型与控制系统

电动汽车(EV, Electric Vehicle)的动力学建模与控制仿真在车辆开发过程中起着至关重要的作用。通过Simulink进行整车动力学模型的构建和控制策略的验证,可以有效评估车辆性能、优化系统设计并降低开发成本。以下是如何在MATLAB和Simulink中设计并仿真一个电动汽车整车动力学模型与控制系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的电动汽车整车动力学模型与控制仿真。该系统能够模拟复杂的整车动力学行为,验证控制策略的有效性,并通过优化设计提高车辆的性能和可靠性。

xiaoheshang_123的博客 550

二分图最大匹配:匈牙利算法的python实现

二分图匹配是很常见的算法问题,一般用匈牙利算法解决二分图最大匹配问题,但是目前网上绝大多数都是C/C++实现版本,没有python版本,于是就用python实现了一下深度优先的匈牙利算法,本文使用的是递归的方式以便于理解,然而迭代的方式会更好,各位可以自行实现。 1、二分图、最大匹配 什么是二分图:二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两...

27Up的博客 3396

34、实数域上高效负循环卷积算法解析

本文介绍了一种高效的实数域负循环卷积算法,通过引入离散傅里叶负循环变换(DFNT)避免传统方法的冗余,显著提升计算效率。文章详细分析了算法原理、误差传播机制,并推导出误差与方差界,提出无误差和基于3σ规则的参数设置方案。结合Cooley-Tukey与Gentleman-Sande FFT路径优化,实验验证了算法在不同精度和多项式长度下的性能优势与结果正确性,为密码学与信号处理等领域提供了高精度、高性能的卷积计算解决方案。

salt的博客 115

浅谈用匈牙利算法寻找二分图的最大匹配

本篇博客主要浅析一下利用匈利亚算法求解二分图

qq_46384359的博客 916

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

匈牙利算法简介 → 二分图最大匹配

匈牙利算法冲突处理的逻辑是“后来者居上”、“腾位子”。

hnjzsyjyj的专栏 963

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

二分图的最大匹配:匈牙利算法

1. 二分图的匹配问题1.1 二分图简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。 准确地说:把一个图的顶点划分为两个不相交集 U 和 V ,使得每一条边都分别连接U 、 V 中的顶点。如果存在这样的划分,则此图为一个二分图。 二分图的一个等价定义是:不含有「含奇数条边的环」的图。图 1 是一个二分图。为了清晰,我们以后都把它画成图 2 的形式。

jinzhao1993的博客 4880

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

二分图最大匹配算法:匈牙利、KM

二分图最大匹配:匈牙利算法 二分图最大权匹配:KM算法

Shilong的博客 1527

二分图最大匹配及匈牙利、HK算法

二分图最大匹配 在二分图中,最大匹配是指选出尽可能多的边使得任意两边没有公共端点。 增广路 设MMM为二分图GGG已匹配的边的集合,若PPP是图GGG中一条连接两个未匹配顶点的路径(起点终点分别在两个集合),属于MMM的边和不属于MMM的边交替出现,则PPP称为MMM的一条增广路(直接匹配的边也是特殊的增广路)。 如下图所示,当111和AAA已经匹配,而尝试寻找222的匹配时,发现它只能匹配AAA: 然后尝试让222匹配AAA,这时再给111找新的匹配的过程看做:从222出发,遍历到AAA;再从AAA遍历

Happig的博客 2395

二分图匹配——最大匹配(匈牙利算法),完美匹配(最大权值匹配,KM算法)

@匈牙利算法,KM算法模板 1.匈牙利算法 匈牙利算法的基本原理如下: ①置M为空; ②找到一条增广路径P,通过异或操作获得更大的匹配M’代替M; ③重复②直到找不到新的增广路径。 增广路径的定义如下: 若P是图G中一条联通两个未匹配顶点的路径,且属于M的边和不属于M的边在P上交替出现,则称P为相对于M的一条增广路径。 ①初始状态 当前已有边(1,1’)和(4,3’)属于M。 ②找到一条增广路径...

weixin_44519109的博客 3754

图论——二分图最大匹配与匈牙利算法

匈牙利算法 二分图概念 二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。准确地说:把一个图的顶点划分为两个不相交集UUU和VVV,使得每一条边都分别连接UUU、VVV中的顶点。如果存在这样的划分,则此图为一个二分图。二分图的一个等价定义是:不含有「含奇数条边的环」的图。 判断一个图是不是二分图,我们可以使用BFS搜索算法,从一个顶点开始搜索整个图,层与层直接交替出现,即二分图的左点集和右点集交替出现,该图是二分图的充分必要条件是,BFS搜索中不出现横向边。等价

jiahonghao2002的博客 1042

二分图二•二分图最大匹配之匈牙利算法

题目地址:http://hihocoder.com/problemset/problem/1122?sid=256694 #1122 : 二分图二•二分图最大匹配之匈牙利算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上一回我们已经将所有有问题的相亲情况表剔除了,那么接下来要做的就是安排相亲了。因为

littledouble的专栏 767

【算法·命运-39】匈牙利算法二分图最大匹配

匈牙利算法 是一种用于解决 二分图最大匹配 问题的经典算法。它能够在 时间复杂度 O(V \times E) 下找到给定二分图的最大匹配。在一个二分图 G=(U,V,E)G = (U, V, E) 中:最大匹配 是指找到一个边的子集,使得:匈牙利算法是基于 增广路径 的贪心算法,依赖于以下思想:通过找到增广路径,将路径上的匹配边和非匹配边反转(匹配变为非匹配,非匹配变为匹配),从而使匹配数增加 1。 4. 算法分析 时间复杂度: 每次寻找增广路径的复杂度为 O(E),其中 EE 是图中的边数。 最

m0_69378371的博客 1178

匈牙利算法(二分图最大匹配;例题:HDU1083)

匈牙利算法 前导知识 什么是二分图? 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图 简单的说就是有两个集合的点,每个集合中的点只能和另外一个集合中的点相连。 链式前向星 一种存图的数据结构,相对不好写但是速度较快。 ...

Radium_1209 1427

二分图的最大匹配2—匈牙利算法

【基本概念】: 二分图: 二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。 无向图G为二分图的充分必要条件是,G至少有两个顶点,且其所有回路的长度均为偶数。 最大匹配: 给定一个二

chlele0105的专栏 9154
上一篇: ACM菜鸟大牛和教主的区别 转自 -> 闲着无聊的博客
下一篇: 面试题——转自http://blog.himdd.com/?p=2977
ColorWaterer
博客等级 码龄12年 16粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值