主要定理二分图的最大匹配算法二分图的带权重的最大匹配
图匹配总结二分图匹配

序言:回忆起最初学习图匹配算法的艰辛与困惑,苦中有乐,但很多时间都浪费在了资料的寻找与甄别上。
因此,在对自己做一次知识总结的同时,整理与记录下了这些文字,希望能够给大家带来一定的帮助。
目录:第一部分:二分图的最大匹配第二部分:五种方式,两类构图第三部分:二分图匹配算法总结第四部分:二分图的最优权值匹配第五部分:一般图的最大匹配第六部分:图匹配题目列表符号说明:N,V:点数E:边数u,v,i,j:节点的标号INF:正无穷大-INF:负无穷大名词说明:时间复杂度:算法的理论时间上界时间效率:实际中算法运行的平均时间效率引用说明:文中参考了一些来源于网络的资料,也有原文全段引用的部分。
在这些资料被n+1次转载后,我已无法获知所有原作者的信息。
在此,对所有前辈们表示真诚的歉意和诚挚的敬意。
特别感谢Amber大神犀利的代码。
作者:Snow_storm正文:第一部分:二分图匹配有这么两个奇怪的工厂:工厂X只生产杯具,工厂Y只生产洗具。
最近,两个工厂决定将产品实行打包策略:即一个杯具搭配上一个洗具。
但由于杯具和洗具的形状和功能各不相同,对于某个类别的杯具来说,只能搭配某些类型的洗具。
现在,两个工厂的厂长大人想知道最多能成功的搭配多少对杯具与洗具。
类似于上面例子中提到的搭配问题,在图论中的有规范的名称:匹配。
注意到,上面的例子中涉及到的物品只有两类(杯具与洗具),且问题只涉及杯具与洗具的匹配,我们把这种只涉及一种关系的匹配问题称为二分匹配问题。
现在,让我们理清一些概念。
二分图:若图G中的点可以分为X和Y两部分,且每部分内部无任何边相连,则称图G为二分图。
匹配:无公共点的边集合(可以想象一下结婚这个词汇)。
匹配数:边集中边的个数最大匹配:匹配数最大的匹配。
如图1-1,展示的就是一个二分图:粗体线表示该二分图的一种匹配方式,不难发现,此时的匹配已经是最大匹配。
图 1-1如何能得到一个二分图的最大匹配?运用简单的枚举:找出全部匹配,然后保留匹配数最多的。
二分图的最大匹配、完美匹配和匈牙利算法

二分图的最大匹配、完美匹配和匈牙利算法August 1, 2013 / 算法这篇文章讲无权二分图(unweighted bipartite graph)的最大匹配(maximum matching)和完美匹配(perfect matching),以及用于求解匹配的匈牙利算法(Hungarian Algorithm);不讲带权二分图的最佳匹配。
二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。
准确地说:把一个图的顶点划分为两个不相交集U和V,使得每一条边都分别连接U、V中的顶点。
如果存在这样的划分,则此图为一个二分图。
二分图的一个等价定义是:不含有「含奇数条边的环」的图。
图 1 是一个二分图。
为了清晰,我们以后都把它画成图 2 的形式。
匹配:在图论中,一个「匹配」(matching)是一个边的集合,其中任意两条边都没有公共顶点。
例如,图3、图 4 中红色的边就是图 2 的匹配。
我们定义匹配点、匹配边、未匹配点、非匹配边,它们的含义非常显然。
例如图 3 中 1、4、5、7 为匹配点,其他顶点为未匹配点;1-5、4-7为匹配边,其他边为非匹配边。
最大匹配:一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配。
图 4 是一个最大匹配,它包含 4 条匹配边。
完美匹配:如果一个图的某个匹配中,所有的顶点都是匹配点,那么它就是一个完美匹配。
图 4 是一个完美匹配。
显然,完美匹配一定是最大匹配(完美匹配的任何一个点都已经匹配,添加一条新的匹配边一定会与已有的匹配边冲突)。
但并非每个图都存在完美匹配。
举例来说:如下图所示,如果在某一对男孩和女孩之间存在相连的边,就意味着他们彼此喜欢。
是否可能让所有男孩和女孩两两配对,使得每对儿都互相喜欢呢?图论中,这就是完美匹配问题。
如果换一个说法:最多有多少互相喜欢的男孩/女孩可以配对儿?这就是最大匹配问题。
基本概念讲完了。
二分图匹配题目类型总结.

二分图匹配题目类型总结二分图最大匹配的匈牙利算法二分图是这样一个图,它的顶点可以分类两个集合X和Y,所有的边关联在两个顶点中,恰好一个属于集合X,另一个属于集合Y。
最大匹配:图中包含边数最多的匹配称为图的最大匹配。
完美匹配:如果所有点都在匹配边上(x=y=m),称这个最大匹配是完美匹配。
最小点覆盖:(二分图)最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和其中一个点关联。
可以证明:最少的点(即覆盖数)=最大匹配数。
支配集:(二分图)最小点覆盖数+孤立点最小边覆盖:找最大匹配(注意可能是任意图最大匹配)m则有2*m 个点被m 条两两不相交的边覆盖。
对于剩下的n-2*m 个点,每个点用一条边覆盖,总边数为n-m条;最小路径覆盖:用尽量少的不相交简单路径覆盖有向无环图G的所有结点。
解决此类问题可以建立一个二分图模型。
把所有顶点i拆成两个:X结点集中的i和Y结点集中的i',如果有边i->j,则在二分图中引入边i->j',设二分图最大匹配为m,则结果就是n-m。
最大独立集问题:(二分图)n-最小点覆盖;任意图最大匹配:(没有奇环)转换为二分图:把所有顶点i拆成两个:X结点集中的i和Y结点集中的i',如果原图中有边i->j,则在二分图中引入边i-> j',j->i’;设二分图最大匹配为m,则结果就是m/2。
最大完全子图:补图的最大独立集三大博弈问题威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
这种情况下是颇为复杂的。
我们用(ak,bk)(ak ≤bk ,k=0,1,2,...,n)表示两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。
前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。
最大权重匹配算法

最大权重匹配算法
最大权重匹配算法也叫做二分图匹配,它是解决二分图中最大匹配问题的一种常见算法。
二分图,顾名思义,就是可以分成两部分的图,即将所有节点分成两部分,使得同一
部分内的节点不连通。
下文中,我们以左侧节点为一部分,右侧节点为一部分。
最大权重匹配算法的目的是,在二分图中找到一种最大匹配方式,并且每条匹配边的
权重之和最大。
在实际问题中,这种算法经常用于任务分配、物流运输、职工配对等方
面。
算法过程:
1. 初始化所有匹配边的权重为0,同时记录每个节点是否被匹配过。
2. 从左侧部分的未匹配节点开始,遍历所有未匹配节点,将其标记为当前选中节
点。
3. 查找与当前选中节点有连通边的所有右侧节点,对于每个右侧节点,都计算出它
和当前选中节点形成的匹配边的权重。
如果该权重比之前已存在的匹配边权重要大,则更
新该匹配边权重,并将当前选中节点和右侧节点确定为一条新的匹配边。
如果需要更新匹
配边,则需要将之前的匹配边删除,统计删除边后,继续查找新的匹配边。
4. 如果当前选中节点不能形成新的匹配边,则回溯到上一个节点,并标记该节点为
已匹配。
5. 重复第2、3、4步操作,直到找出全部最大匹配边。
该算法的时间复杂度为O(n^3),属于多项式时间内可解决问题的范围,而且是一种较为高效的匹配算法。
但是需要注意的是,该算法必须满足是一个二分图才可以使用。
同时,算法并不能保证是一个最小顶标和、最优匹配的算法,但在大多数情况下,都可以得到较
好的匹配效果。
二分图匹配问题最大匹配以及相关结论多重匹配最大带权匹配带花树算法

⼆分图匹配问题最⼤匹配以及相关结论多重匹配最⼤带权匹配带花树算法⼆分图匹配问题:做法:①匈⽛利算法,时间复杂度O(N*V)②Hopcroft-Karp,时间复杂度O(√N*V)相关结论:①最⼩顶点覆盖(könig定理) ⼆分图的最⼩顶点覆盖=最⼤匹配数②最⼩路径覆盖(不要求⼆分图):在图中找⼀些路径,使之覆盖了图中的所有顶点,且任何⼀个顶点有且只有⼀条路径与之关 最⼩路径覆盖 = 顶点数 - 最⼤匹配配对于有向⽆环图,⾸先拆点,建成⼆分图再进⾏求解·最⼩不相交路径覆盖 建图⽅式:把⼀个的点V拆点成Vx和Vy,如果A连向B,那么就建⼀条Ax连向By的边。
图中有多少条路径,可以以⼀种⽅法得到,就是计算出度为0的点的个数。
如果知道这个就很容易得出这个结论了 ·最⼩相交路径覆盖 做法⾸先跑floyd,求出原图的传递闭包,然后⽤上述⽅法做即可③最⼩边覆盖最⼩边覆盖=图顶点-最⼤匹配⾸先⼀开始,假如⼀条边都不选的话,要覆盖所有的点就必须每个点都选⼀次,也就是n次,然后每选⼀条边就会减少1个,所以结论显⽽易见④最⼤独⽴集最⼤独⽴集=图顶点-最⼤匹配=最⼩边覆盖⼆分图的独⽴数等于顶点数减去最⼤匹配数,很显然的把最⼤匹配两端的点都从顶点集中去掉这个时候剩余的点是独⽴集,这是|V|-2*|M|,同时必然可以从每条匹配边的两端取⼀个点加⼊独⽴集并且保持其独⽴集性质。
⼆分图多重匹配( ⼀ ) 如果x部节点只对应⼀个y部节点,⽽y部节点可以对应多个x部节点,那么这种匹配可以⽤匈⽛利算法来解决解决的问题:⼀个y最多匹配cnt个x是否成⽴,要问⼀个y匹配⼈数最⼤的最⼩值可以⽤⼆分答案来做解决思路:根据匈⽛利算法的思想,这时的link[u]要变成link[u][i],表⽰与y[u]匹配好了的第i个点,⽤vlink[u]记录已经于u点匹配了的点的个数,对于x中的x[k],找到⼀个与他相连的y[i]后,同样判断匈⽛利算法中的两个条件是否成⽴,若满⾜第⼀个条件,直接将x[k],y[i]匹配,否则,如果与y[i]所匹配的点已经达到了饱和,那么在所有与y[i]配合的点中选⼀个点,检查能否找到增⼴路,如果能,就让出位置让x[k]与y[i]匹配( ⼆ )如果x部节点可以匹配多个y部节点,y部节点可以同时匹配多个x部节点,那么应该⽤⽹络流来解决。
二分图匹最大配与最佳匹配

二分图:二分图是这样的一个图,它的顶点可以分为两个集合X和Y。
所有的边关联的两个顶点中,恰好一个属于集合X,一个属于集合Y。
二分图的匹配:给定一个二分图G,M为G边集的一个子集,如果M满足当中的任意两条边都不依附于同一个顶点,则称M是一个匹配。
二分图的最大匹配:二分图的所有匹配中包含边数最多的匹配称为图的最大匹配。
完美(完备)匹配:如果所有点都在匹配边上,称这个最大匹配是完美匹配。
最佳匹配:如果边上带权的话,找出权和最大的匹配叫做求最佳匹配。
增广路径:也称增广轨或交错轨。
若P是图G中一条连通两个未匹配顶点的路径,并且属最大匹配边集M的边和不属M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广轨。
定义总是抽象的下面通过图来理解它。
图中的线段(2->3, 3->1, 1->4)便是上面所说的p路径,我们假定边(1,3)是以匹配的边,(2,3)(1,4)是未匹配的边,则边(4,1)边(1,3)和边(3,2)在路径p上交替的出现啦,那么p就是相对于M的一条增广轨,这样我们就可以用边1,4 和边2,3 来替换边1,3 那么以匹配的边集数量就可以加1,。
下面给出关于二分图最大匹配的三个定理1:最大匹配数+ 最大独立集= n + m2:二分图的最小覆盖数= 最大匹配数3:最小路径覆盖= 最大独立集最大独立集是指求一个二分图中最大的一个点集,该点集内的点互不相连。
最小顶点覆盖是指在二分图中,用最少的点,让所有的边至少和一个点有关联。
最小路径覆盖是指一个不含圈的有向图G 中,G的一个路径覆盖是一个其结点不相交的路径集合P,图中的每一个结点仅包含于P 中的某一条路径。
路径可以从任意结点开始和结束,且长度也为任意值,包括0.1求解二分图最大匹配的方法:●匈牙利算法(时间复杂度O(nm))其思想是是通过不断的寻找增广轨实现最大匹配。
●转化为单位容量简单网络的最大流问题(本文不介绍)在二分图的基础上,加入源点s和汇点t,让s与每个X结点连一条边,每个Y结点和t连一条边,所有弧的容量为1。
[算法]二分图最大匹配
[算法]⼆分图最⼤匹配前⾔具体什么是⼆分图,如何判定,可以参考。
定义简单来说,就是⼆分图中有满⾜任意两条边没有相同的点的边的集合,称为⼀组匹配,⽽边数最多的⼀组匹配称为该⼆分图的最⼤匹配。
在⼀组匹配中,属于这组边的称为匹配边,不属于的称为⾮匹配边,属于这组匹配的点称为匹配点,不属于的称为⾮匹配点。
匈⽛利算法⼜称增⼴路算法。
对于⼀组匹配 \(M\) ,若存在⼀条路径连接两个⾮匹配点,且使得匹配边与⾮匹配边交替出现,则称这条路径为增⼴路。
如上图,已匹配的边为红⾊,未匹配的边为绿⾊,则可以找到⼀组增⼴路 \(8\) ~ \(2\) ~ \(7\) ~ \(4\) 。
不难发现增⼴路具有以下特点:以⾮匹配边开始,在以⾮匹配边结尾,那么长度必为奇数。
路径上第⼀条边因为第⼀个点为奇数,则该路径上的第⼀个点为⾮匹配边,按照匹配边与⾮匹配边交替出现的性质可以得出,该路径的第奇数条边必为⾮匹配边,已经匹配的边必为第偶数条边,则有⾮匹配边的边数⽐匹配边的边数多⼀。
最⼤匹配中不会有增⼴路。
证明:假设最⼤匹配中存在增⼴路,则可以将增⼴路中的所有边的状态取反(即把⾮匹配边转换为匹配边,将匹配边转换为⾮匹配边),得到另⼀组匹配,⽽这组匹配的匹配边肯定会⽐之前的⼀组匹配的边数多⼀,则之前的这组匹配就不是最⼤匹配,与假设⽭盾,证毕。
在⼀张⼆分图中,若最⼤匹配为 \(S\) ,当且仅当 \(S\) 中不存在增⼴路。
其确性基于 \(hall\) 定理,⽐较复杂就不在详讲,主要讲找⼆分图最⼤匹配的⽅法。
⼤体思想就是枚举左部点,找到增⼴路后将这条路上的所有边的状态取反,得到边数更⼤的⼀组匹配。
在匹配过程中,有两种情况会改变当前左部点 \(u\) 的匹配情况。
1. 与之对应的右部点 \(v\) 是⾮匹配点,则可以将其的连边变为匹配边。
2. 与之对应的右部点 \(v\) 是匹配点,但与 \(v\) 已经匹配的点 \(u'\) 可以找到另⼀个未匹配的右部点 \(v'\) ,则 \(u\) ~ \(v\) ~ \(u'\) ~ \(v'\) 为⼀条增⼴路,则将其状态取反。
二分图最大匹配总结
⼆分图最⼤匹配总结⼆分图匹配(匈⽛利算法)1。
⼀个⼆分图中的最⼤匹配数等于这个图中的最⼩点覆盖数König定理是⼀个⼆分图中很重要的定理,它的意思是,⼀个⼆分图中的最⼤匹配数等于这个图中的最⼩点覆盖数。
如果你还不知道什么是最⼩点覆盖,我也在这⾥说⼀下:假如选了⼀个点就相当于覆盖了以它为端点的所有边,你需要选择最少的点来覆盖所有的边。
2。
最⼩路径覆盖=最⼩路径覆盖=|G|-最⼤匹配数在⼀个N*N的有向图中,路径覆盖就是在图中找⼀些路经,使之覆盖了图中的所有顶点,且任何⼀个顶点有且只有⼀条路径与之关联;(如果把这些路径中的每条路径从它的起始点⾛到它的终点,那么恰好可以经过图中的每个顶点⼀次且仅⼀次);如果不考虑图中存在回路,那么每每条路径就是⼀个弱连通⼦集.由上⾯可以得出:1.⼀个单独的顶点是⼀条路径;2.如果存在⼀路径p1,p2,......pk,其中p1 为起点,pk为终点,那么在覆盖图中,顶点p1,p2,......pk不再与其它的顶点之间存在有向边.最⼩路径覆盖就是找出最⼩的路径条数,使之成为G的⼀个路径覆盖.路径覆盖与⼆分图匹配的关系:最⼩路径覆盖=|G|-最⼤匹配数;3。
⼆分图最⼤独⽴集=顶点数-⼆分图最⼤匹配独⽴集:图中任意两个顶点都不相连的顶点集合。
⼆分图模板:模板⼀:匈⽛利算法/* **************************************************************************//⼆分图匹配(匈⽛利算法的DFS实现)//初始化:g[][]两边顶点的划分情况//建⽴g[i][j]表⽰i->j的有向边就可以了,是左边向右边的匹配//g没有边相连则初始化为0//uN是匹配左边的顶点数,vN是匹配右边的顶点数//调⽤:res=hungary();输出最⼤匹配数//优点:适⽤于稠密图,DFS找增⼴路,实现简洁易于理解//时间复杂度:O(VE)//***************************************************************************///顶点编号从0开始的const int MAXN=510;int uN,vN;//u,v数⽬int g[MAXN][MAXN];int linker[MAXN];bool used[MAXN];bool dfs(int u)//从左边开始找增⼴路径{int v;for(v=0;v<vN;v++)//这个顶点编号从0开始,若要从1开始需要修改if(g[u][v]&&!used[v]){used[v]=true;if(linker[v]==-1||dfs(linker[v])){//找增⼴路,反向linker[v]=u;return true;}}return false;//这个不要忘了,经常忘记这句}int hungary(){int res=0;int u;memset(linker,-1,sizeof(linker));for(u=0;u<uN;u++){memset(used,0,sizeof(used));if(dfs(u)) res++;}return res;}//******************************************************************************/模板⼆: Hopcroft-Carp算法这个算法⽐匈⽛利算法的时间复杂度要⼩,⼤数据可以采⽤这个算法/* *********************************************⼆分图匹配(Hopcroft-Carp的算法)。
二分图最大匹配问题(贪心算法)
贪心算法
下面,我们引进一种能够完美解决二分图 最大匹配问题的贪心算法。
会议安排
一个重要的会议由A公司的M位代表和B公司的N 位代表参加(M,N≤1000,代表用1,2,……, M和1,2,……,N表示)。他们被预先分成 K(K≤60000)组进行谈判。每组两个人分别来自A 公司和B公司。每个参加会议的代表都至少参加 了一组谈判。会议为每一个代表都准备了一个房 间。技术人员将会在一些房间之间连上直通电话, 一个代表至少要和他的一个谈判对手直接联络。 连接一个直通电话的价格是常数。技术人员要用 尽量少的花费满足会议的要求。
主程序代码
n:=n+m; while tot<n do begin b:=maxlongint;//找结点u for a:=1 to n do if(not visit[a])and(degree[a]<b)then begin b:=degree[a]; c:=a; end; a:=u[c]; b:=maxlongint;// b:=maxlongint;//找结点v v while a<>0 do begin if(not visit[v[a]])and(degree[v[a]]<b)then begin b:=degree[v[a]]; d:=v[a]; end; a:=next[a]; end; inc(ans);//连边,答案加一 ins(c);//对u进行删除操作 if b<>maxlongint then ins(d);//如果存在v,对v进行删除操作 end; writeln(ans);; end.
贪心算法
这样循环做下来,我们每做一次都相当于 连了一条边(u,v),于是inc(ans)。 同时,我们对这条边的两个端点u,v都做了 删除操作(如果可以的话)。每删一个点 就inc(tot),直到tot=n+m,即两边的点均被 删完。 此时我们得到的ans值即为答案,直接输出 即可。
Kuhn-Munkres算法(二分图最大权匹配)===
二分图如果是没有权值的,求最大匹配。
则是用匈牙利算法求最大匹配。
如果带了权值,求最大或者最小权匹配,则必须用KM算法。
其实最大和最小权匹配都是一样的问题。
只要会求最大匹配,如果要求最小权匹配,则将权值取相反数,再把结果取相反数,那么最小权匹配就求出来了。
KM算法及其难理解。
看了几天还无头绪。
先拿上一直采用的KM算法模板,按照吉林大学的模板写的。
试试了好多次感觉都没有出错。
/******************************************************二分图最佳匹配(kuhn munkras 算法 O(m*m*n)).邻接矩阵形式。
返回最佳匹配值,传入二分图大小m,n邻接矩阵 mat ,表示权,match1,match2返回一个最佳匹配,为匹配顶点的match值为-1,一定注意m<=n,否则循环无法终止,最小权匹配可将全职取相反数。
初始化: for(i=0;i<MAXN;i++)for(j=0;j<MAXN;j++) mat[i][j]=-inf;对于存在的边:mat[i][j]=val;//注意不能负值********************************************************/#include<string.h>#define MAXN 310#define inf 1000000000#define _clr(x) memset(x,-1,sizeof(int)*MAXN)int KM(int m,int n,int mat[][MAXN],int *match1,int *match2){int s[MAXN],t[MAXN],l1[MAXN],l2[MAXN];int p,q,i,j,k,ret=0;for(i=0;i<m;i++){l1[i]=-inf;for(j=0;j<n;j++)l1[i]=mat[i][j]>l1[i]?mat[i][j]:l1[i];if(l1[i]==-inf) return -1;}for(i=0;i<n;i++)l2[i]=0;_clr(match1);_clr(match2);for(i=0;i<m;i++){_clr(t);p=0;q=0;for(s[0]=i;p<=q&&match1[i]<0;p++){for(k=s[p],j=0;j<n&&match1[i]<0;j++){if(l1[k]+l2[j]==mat[k][j]&&t[j]<0){s[++q]=match2[j];t[j]=k;if(s[q]<0){for(p=j;p>=0;j=p){match2[j]=k=t[j];p=match1[k];match1[k]=j;}}}}}if(match1[i]<0){i--;p=inf;for(k=0;k<=q;k++){for(j=0;j<n;j++){if(t[j]<0&&l1[s[k]]+l2[j]-mat[s[k]][j]<p) p=l1[s[k]]+l2[j]-mat[s[k]][j];}}for(j=0;j<n;j++)l2[j]+=t[j]<0?0:p;for(k=0;k<=q;k++)l1[s[k]]-=p;}}for(i=0;i<m;i++)ret+=mat[i][match1[i]];return ret;}下面是从网上的博客摘抄的一些零散的总结。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
是最大匹配。 于是,存在 G 上另外一个匹配 M’,有|M’| > |M|。
2020/4/21
山东大学 软件学院
10
证明
令 H 是 G 上 M’M 的导出子图。
由于 H 中的每个顶点最多只能和 M 中的一条边以及 M’中的
终止在 k 的一条增广路被找到。从 k 开始,
反向追踪标号找到这条增广路 P,路的起
始顶点有标号“”。
用增广路 P 更新 M。
删除 G 上所有的标号。重新对 S 中所有不
在 M 中的顶点标号“”,然后将这些顶
点都加入 Q。
endif
山东大学 软件学院
14
二分图上最大匹配的标号算法
15
endif
16 endwhile
第6章 图与网络分析
6.7 最大匹配问题
2020/4/21
最大对集(匹配)问题
二分图的对集,基本概念,主要定理 二分图的最大匹配算法 二分图的带权重的最大匹配——分派问题及算法
2020/4/21
山东大学 软件学院
2
基本概念
图 G = (V, E)的对集 M:M 是 E 的子集,且 M 中任意两条边 均不相邻(都不共享顶点)。
2020/4/21
山东大学 软件学院
22
时间复杂度分析
令|S| = m,|T| = n,假设 m n。 找一条增广路(或判断不能找到)标号算法最多进行 O(mn)
次检查(因为最多有这么多条边)。 初始匹配最多被增广 m 次。 所以,总的计算量为 O(m2n)。
2020/4/21
山东大学 软件学院
连通的顶点的集合。 而 Y 是 T 中通过“M*-交错路”与 u 连通的所有顶点的集合。 因此,(X) Y。 即,(X) = Y。 因此,|(X)| = |Y| = |X| 1 < |X|,与(*)矛盾。
2020/4/21
山东大学 软件学院
34
König定理
定理 6.8.3(König,1931) 在二分图中,最大基数对集的边 数等于最小顶点覆盖的点数。 证:设 G = (S, T, E)是一个二分图,M*是 G 上的最大匹配。
若(s, t) M,如图中的(s, t1),则 t1 位于从 u 到 s 的交错路上。
若(s, t) M,如图中的(s, t2),则从 u 到 s 的 M*-交错路 {(s,
t2)}是一条从 u 到 t2 的交错路。
2020/4/21
山东大学 软件学院
33
证明
取遍 X 中所有的点 s,就能遍历(X)中所有的点 t。 因此(X)是 T 中通过“只经过 X 中的点的 M*-交错路”与 u
M-增广路 P。 若 P 存在,则通过交换 P 在 M 和不在 M 中的边,便得到一
个其基数增加 1 的匹配。 然后从新的匹配开始,继续迭代,直到不存在 M-增广路,
则当前的匹配就是 G 的最大匹配。
2020/4/21
山东大学 软件学院
12
二分图上最大匹配的标号算法
输入:二分图 G = (S, T, E)。 输出:G 的最大匹配 M。 1 M 。 2 对 S 中所有不在 M 中的顶点标号“”,然后将这些顶点
2020/4/21
山东大学 软件学院
6
证明
再由流守恒约束,V中每个顶点最多有一条出去的边流值为 1。同理,U中每个顶点最多有一条进来的边流值为1。 记M = {e E | e上的流值 > 0},因此M中的任何两条边均不 共享顶点,即,M是一个匹配,且|f*| = |M|。 因此,显然有|f*| |M|。
X 的一个子集。因此 X Y X 。
()。反证。假设 G 满足(*)式,但 G 没有匹配 S 中所有顶点
的匹配。
令 M*是 G 的一个最大匹配。则 M*没有匹配 S 中所有的顶
点。设 u 是一个未被 M*匹配的顶点。
2020/4/21
山东大学 软件学院
31
证明
令 Z 为从 u 出发经过 M*-交错路可达的所有顶点的集合。
2020/4/21
山东大学 软件学院
17
例子
1
6
2
72
3
82
4
9
5
10
找到一条增广路(2, 8)。更新M。
2020/4/21
山东大学 软件学院
18
例子
1
63
2
7
3
83
4
93
5
10 3
找到一条增广路(3, 10)。更新M。
2020/4/21
山东大学 软件学院
19
例子
2020/4/21
1 2 10 3 4 5
通 过 构 造 一 个 大 小 和 |M*| 相 等 的 最 小 顶 点 覆 盖 来 证 明 定 理。 令 U 表示 S 中 M*未匹配的顶点的集合,Z 表示从 U 中的 顶点出发经过 M*-交错路能够到达的顶点的集合。 令 X = Z S,Y = Z S。 由 Y 的定义,可知 M*匹配了 Y 中的所有的顶点;由 Hall 定理的证明,可知(X) = Y。
2020/4/21
山东大学 软件学院
24
解释
2020/4/21
山东大学 软件学院
25
标号,找增广路
u4
v1
v2
u2
v3
u3
v5
u6
v5
u5
v2
2020/4/21
山东大学 软件学院
26
找增广路过程中形成的搜索树
虚线表示v5, u3相邻, 但在对v5进行检查的过程中, u3已经标号,因此从v5不能 对u3标号。
一条边关联,因此 H 中每个顶点的度都不超过 2(都是 1 或
者 2)。
因此,H 的每个连通分支或者是边在 M 和 M’中交错出现的
路,或者是边在 M 和 M’中交错出现的偶圈。
由于在 G 中有|M’| > |M|,而 H 是 M’和 M 的对称差,M’在
H 中的边数必然也 > M 在 H 中的边数。
这表明 H 中至少有一个连通分支,是一条起始于 M’中的边
又终止于 M’中的边的路。
由定义,这条路是一条 M-增广路,与给定条件矛盾。
2020/4/21
山东大学 软件学院
11
通过增广路求二分图上的最大匹配
从图 G = (S, T, E)的任意一个匹配 M 开始,比如空集。 由 S 的一个未被匹配的顶点出发,用一个系统方法搜索一条
23
解释
从S中未匹配的顶点开始,标号找M-增广路的过程,实际上 是一个从S中未匹配的顶点开始进行广度优先搜索的过程。 该过程与标准的广度优先搜索不完全相同。 设搜索树的根位于第1层。区别仅在于,在搜索过程中,奇 数层顶点(在S一侧)按广度优先展开;偶数层顶点(在T 一侧)按M中的(唯一一条)边顺延(而不是按广度优先 展开)。
2020/4/21
山东大学 软件学院
4
例子
2020/4/21
山东大学 软件学院
5
定理
定理:记G’上的最大流为f*,流值为|f*|。G上的最大匹配 为M*。则|f*| = |M*|。 证明:首先证|f*| |M*|。 给定最大ቤተ መጻሕፍቲ ባይዱ配M*,令G’上M*中的边的流值为1,s到M*匹 配的V一侧点的各条边上流值为1,M*匹配的U一侧点到t的 各条边上流值为1,则构造了一个流值为|M*|的流f。 因此,显然有|f*| |M*|。 再证|f*| |M*|。 设f*为G’上的最大流。 由整流定理,G’上每条边上的流值为整数。由于每条边的 容量均为1,因此G’上每条边的流值不是0就是1。
2020/4/21
山东大学 软件学院
7
基本概念
M -交错路:边在对集 M 和 E \ M 中交错出现的路。 M -增广路:起点和终点都不在 V(M)中的 M -交错路。 顶点覆盖 K:K 是 V(G)的子集,且 G 的每条边都至少有一
个端点在 K 中。 最小顶点覆盖 K:不存在另外一个覆盖 K’,使得 K K 。
2020/4/21
山东大学 软件学院
8
顶点覆盖
2020/4/21
山东大学 软件学院
9
定理6.8.1
定理 6.8.1(Berge, 1957)图 G 中的一个匹配 M 是最大匹配当且 仅当 G 不包含 M-增广路。 (说明:G 是一般图,不要求是二分图。) 证:()。G 上若有 M-增广路,则可以使用这条路更新 M 得
2020/4/21
山东大学 软件学院
27
增广,得到一个更大的匹配
2020/4/21
山东大学 软件学院
28
广度优先搜索的观点
2020/4/21
构造的辅助图
山东大学 软件学院
从辅助图上入度为0 的点v2开始的广度 优先搜索
29
辅助图的构造
顶点集 = V。 从v1到v2有一条有向边,当且仅当 v2是从v1开始的增广路上 下一个V中的顶点。
2020/4/21
山东大学 软件学院
3
使用最大流算法求二分图上的最大匹配
给定二分图G = (V, U, E),构造流网络。 增加一个源点 s,从 s 到 V 中每个顶点引一条有向边。 增加一个目标顶点 t,从 U 中每个顶点向 t 引一条有向边。 E中的边均从 V 指向 U。 记得到的流网络为G’ = (V’, E’)。G’中的每条边均为单位容 量。 计算G’上从 s 到 t 的最大流。 E 中的饱和边即构成 G 上的一个最大匹配。
由假设,Z 中除 u 外所有的点都被 M*匹配。(否则可找到一