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

合集下载

Ku二分图最大权匹配(KM算法)hn

Ku二分图最大权匹配(KM算法)hn

Maigo的KM算法讲解(的确精彩)顶点Yi的顶标为B[i],顶点Xi与Yj之间的边权为w[i,j]。

在算法执行过程中的任一时刻,对于任一条边(i,j),A[i]+B[j]>=w[i,j]始终成立。

KM 算法的正确性基于以下定理:* 若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最大权匹配。

这个定理是显然的。

因为对于二分图的任意一个匹配,如果它包含于相等子图,那么它的边权和等于所有顶点的顶标和;如果它有的边不包含于相等子图,那么它的边权和小于所有顶点的顶标和。

所以相等子图的完备匹配一定是二分图的最大权匹配。

初始时为了使A[i]+B[j]>=w[i,j]恒成立,令A[i]为所有与顶点Xi关联的边的最大权,B[j]=0。

如果当前的相等子图没有完备匹配,就按下面的方法修改顶标以使扩大相等子图,直到相等子图具有完备匹配为止。

我们求当前相等子图的完备匹配失败了,是因为对于某个X顶点,我们找不到一条从它出发的交错路。

这时我们获得了一棵交错树,它的叶子结点全部是X顶点。

现在我们把交错树中X顶点的顶标全都减小某个值d,Y顶点的顶标全都增加同一个值d,那么我们会发现:两端都在交错树中的边(i,j),A[i]+B[j]的值没有变化。

也就是说,它原来属于相等子图,现在仍属于相等子图。

两端都不在交错树中的边(i,j),A[i]和B[j]都没有变化。

也就是说,它原来属于(或不属于)相等子图,现在仍属于(或不属于)相等子图。

X端不在交错树中,Y端在交错树中的边(i,j),它的A[i]+B[j]的值有所增大。

它原来不属于相等子图,现在仍不属于相等子图。

X端在交错树中,Y端不在交错树中的边(i,j),它的A[i]+B[j]的值有所减小。

也就说,它原来不属于相等子图,现在可能进入了相等子图,因而使相等子图得到了扩大。

现在的问题就是求d值了。

图匹配总结二分图匹配

图匹配总结二分图匹配

序言:回忆起最初学习图匹配算法的艰辛与困惑,苦中有乐,但很多时间都浪费在了资料的寻找与甄别上。

因此,在对自己做一次知识总结的同时,整理与记录下了这些文字,希望能够给大家带来一定的帮助。

目录:第一部分:二分图的最大匹配第二部分:五种方式,两类构图第三部分:二分图匹配算法总结第四部分:二分图的最优权值匹配第五部分:一般图的最大匹配第六部分:图匹配题目列表符号说明: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 是一个完美匹配。

显然,完美匹配一定是最大匹配(完美匹配的任何一个点都已经匹配,添加一条新的匹配边一定会与已有的匹配边冲突)。

但并非每个图都存在完美匹配。

举例来说:如下图所示,如果在某一对男孩和女孩之间存在相连的边,就意味着他们彼此喜欢。

是否可能让所有男孩和女孩两两配对,使得每对儿都互相喜欢呢?图论中,这就是完美匹配问题。

如果换一个说法:最多有多少互相喜欢的男孩/女孩可以配对儿?这就是最大匹配问题。

基本概念讲完了。

二分图匹配匹配

二分图匹配匹配

应用2
• 覆盖集与独立集互为补集 • 二分图中可求出最大匹配M • 最小覆盖集=M,最大独立集=n-M
应用3
• 一共N个男孩和女孩参加聚会,某些男孩和女孩 之间会产生恋爱关系。现在希望找到最多的孩子, 他们之间不会产生恋爱关系。
应用3
• 男孩在一边,女孩在一边 • 会产生恋爱关系的连边 • 找最大独立集
应用2
• 覆盖集的补集一定是独立集 • 证明: 假设某一覆盖集的补集不是独立集。说 明有一条边连接了覆盖集的补集的两个点。 那么这条边没有被覆盖集所覆盖,产生矛 盾。
应用2
• 独立集的补集一定是覆盖集 • 证明: 假设某一独立集的补集不是覆盖集。说 明有一条边不被独立集的补集覆盖,那么 这条边连接了独立集的两个端点,产生矛 盾。
KM算法
• X端不在交错树中,Y端在交 错树中的边(i,j),它的A[i]+B[j] 的值有所增大。它原来不属 于相等子图,现在仍不属于 相等子图。
KM算法
• X端在交错树中,Y端不在交 错树中的边(i,j),它的A[i]+B[j] 的值有所减小。也就说,它 原来不属于相等子图,现在 可能进入了相等子图,因而 使相等子图得到了扩大。
图论2
江川
二分图
• 一个图的点集可以划分为两个不相交的子 集,每一个子集中的点和该子集中的其他 点没有边相连
二分图
• 一个图是二分图的充要条件是这个图里没 有奇环
二分图匹配
• 匹配:给定一个二分图G,M为G边集的一 个子集,如果M满足当中的任意两条边都不 依附于同一个顶点,则称M是一个匹配。 • 最大匹配:所有匹配中边数最多的。 • 完备匹配:如果一个匹配中,图中的每个 顶点都和图中某条边相关联,则称此匹配 为完备匹配。

最大权重匹配算法

最大权重匹配算法

最大权重匹配算法
最大权重匹配算法也叫做二分图匹配,它是解决二分图中最大匹配问题的一种常见算法。

二分图,顾名思义,就是可以分成两部分的图,即将所有节点分成两部分,使得同一
部分内的节点不连通。

下文中,我们以左侧节点为一部分,右侧节点为一部分。

最大权重匹配算法的目的是,在二分图中找到一种最大匹配方式,并且每条匹配边的
权重之和最大。

在实际问题中,这种算法经常用于任务分配、物流运输、职工配对等方
面。

算法过程:
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。

Ku二分图最大权匹配(KM算法)hn

Ku二分图最大权匹配(KM算法)hn

Kuhn-Munkres 算法Maigo 的 KM 算法讲解(的确精彩)KM 算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转 化为求完备匹配的问题的。

设顶点 Xi 的顶标为 A[i],顶点 Yi 的顶标为 B[i],顶点 Xi 与 Yj 之间的边权为 w[i,j]。

在算法执行过程中 的任一时刻,对于任一条边(i,j), A[i]+B[j]>=w[i,j]始终成立。

KM 算法的正确 性基于以下定理: * 若由二分图中所有满足 A[i]+B[j]=w[i,j]的边(i,j)构成的子图 (称做相等子 图)有完备匹配,那么这个完备匹配就是二分图的最大权匹配。

这个定理是显然的。

因为对于二分图的任意一个匹配,如果它包含于相 等子图,那么它的边权和等于所有顶点的顶标和;如果它有的边不包含于相 等子图,那么它的边权和小于所有顶点的顶标和。

所以相等子图的完备匹配 一定是二分图的最大权匹配。

初始时为了使 A[i]+B[j]>=w[i,j]恒成立,令 A[i]为所有与顶点 Xi 关联的边 的最大权,B[j]=0。

如果当前的相等子图没有完备匹配,就按下面的方法修改 顶标以使扩大相等子图,直到相等子图具有完备匹配为止。

我们求当前相等子图的完备匹配失败了,是因为对于某个 X 顶点,我们 找不到一条从它出发的交错路。

这时我们获得了一棵交错树,它的叶子结点 全部是 X 顶点。

现在我们把交错树中 X 顶点的顶标全都减小某个值 d,Y 顶 点的顶标全都增加同一个值 d,那么我们会发现:两端都在交错树中的边(i,j),A[i]+B[j]的值没有变化。

也就是说,它原来属于 相等子图,现在仍属于相等子图。

两端都不在交错树中的边(i,j),A[i]和 B[j]都没有变化。

也就是说,它原来属于 (或不属于)相等子图,现在仍属于(或不属于)相等子图。

X 端不在交错树中,Y 端在交错树中的边(i,j),它的 A[i]+B[j]的值有所增大。

[算法]二分图最大匹配

[算法]二分图最大匹配

[算法]⼆分图最⼤匹配前⾔具体什么是⼆分图,如何判定,可以参考。

定义简单来说,就是⼆分图中有满⾜任意两条边没有相同的点的边的集合,称为⼀组匹配,⽽边数最多的⼀组匹配称为该⼆分图的最⼤匹配。

在⼀组匹配中,属于这组边的称为匹配边,不属于的称为⾮匹配边,属于这组匹配的点称为匹配点,不属于的称为⾮匹配点。

匈⽛利算法⼜称增⼴路算法。

对于⼀组匹配 \(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的算法)。

离散数学_二分图与匹配

离散数学_二分图与匹配

二分图与匹配
满足如下条件的无向图G=<V,E>有非空集合X,Y:X∪Y=V,X∩Y=∅,且每个vᵢ ,vⱼ∈E,都有:vᵢ∈X∧vⱼ∈Y,或者vᵢ∈Y∧vⱼ∈X可以用G=<X,E,Y>表示二分图
完全二分图 : 如果X,Y中任意两个顶点之间都有边,则称为完全二分图
匹配 : 将E的子集M称作一个匹配
最大匹配 : 如果M中的任意两条边都没有公共端点边数最多的匹配称作最大匹配
完全匹配 : 如果X(Y)中的所有的顶点都出现在匹配M中,则称M是X(Y)-完全匹配 如果M既是X-完全匹配,又是Y-完全匹配,称M是完全匹配最大匹配匈牙利算法 : ①任意取一个匹配M (可以是空集或只有一条边) ②令S是非饱和点(尚未匹配的点)的集合 ③如果S=∅,则M已经是最大匹配 ④从S中取出一个非饱和点u₀作为起点,从此起点走交错路(交替属于M和非M的边构成的极大无重复点通路或回路)P ⑤如果P是一个增广路(P的终点也是非饱和点),则令M=M⊕P=(M-P)∪(P-M) ⑥如果P都不是增广路,则从S中去掉u₀,转到step3。

二分图最大权完美匹配KM算法

二分图最大权完美匹配KM算法

二分图最大权完美匹配KM算法好吧,这弄点正经的。

这次就写写大家肯定很久以前就搞出来的KM。

我写这个是因为前几天整理模板的时候居然发现我的KM还是O(n^4)的,虽然实际运行效果大部分和O(n^3)差不多,但是理论的上界仍然让我不爽,就像network simplex algorithm一样。

先说一下KM的适用范围。

据我分析KM实际上可以对任意带权(无论正负权)二分图求最大/最小权完美匹配,唯一的一个,也是最重要的一个要求就是这个匹配必须是完美匹配,否则KM的正确性将无法得到保证。

这个当了解了KM的正确性证明之后自然就会知道。

非完美的匹配的似乎必须祭出mincost maxflow了。

然后就是KM的时间界。

这里略去KM的步骤不谈。

众所周知,KM弄不好就会写出O(n^4)的算法,而实际上是存在O(n^3)的实现的。

那么O(n^4)究竟是慢在什么地方呢?这个就需要搞清楚O(n^4)的4究竟是怎么来的。

每个点都需要作一次增广,所以有一个n的循环。

每个循环内部,每次可能无法得到一条增广路,需要新加入一个y顶点,然后重新寻找增广路。

一次最少加进1个点,所以最多加入n次。

每次重新找一遍增广路n^2,更新距离标号需要扫描每一条边n^2,所以迭加起来O(n)*O(n)*O(n^2),结果自然就是O(n^4)。

第一层和第二层循环似乎没有很好的方法可以把它搞掉,所以我们只能从第三层,也就是每次的O(n^2)入手。

这一层包括两个部分,一个是增广路的n^2,一个是更新标号的n^2,需要将二者同时搞掉才能降低总共的复杂度。

注意更新标号之后有一个最重要的性质,那就是原来存在的合法边仍然合法,更新只是将不合法的边变得合法。

所以当我们找到一次交错树,没有增广路之后,下次再寻找的时候完全没有必要重新开始,因为原先有的边更新之后还有,所以完全可以接着上一次得到的交错树继续寻找。

那么应该从什么地方继续号、开始搜索呢?很明显是那些新加进的点,也就是新进入的那些y点。

图论二分图匹配算法详细分析总结

图论二分图匹配算法详细分析总结

二分图匹配算法总结 (by phoenixinter, Aug 2006)最近下决心要把二分图匹配部分的算法都搞搞清楚,努力了几天之后基本上搞定了,下面做一个这个专题的总结。

一、二分图最大匹配二分图最大匹配的经典匈牙利算法是由Edmonds在1965年提出的,算法的核心就是根据一个初始匹配不停的找增广路,直到没有增广路为止。

匈牙利算法的本质实际上和基于增广路特性的最大流算法还是相似的,只需要注意两点:(一)每个X节点都最多做一次增广路的起点;(二)如果一个Y节点已经匹配了,那么增广路到这儿的时候唯一的路径是走到Y节点的匹配点(可以回忆最大流算法中的后向边,这个时候后向边是可以增流的)。

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

二、Hopcroft-Karp算法SRbGa很早就介绍过这个算法,它可以做到O(sqrt(n)*e)的时间复杂度,并且在实际使用中效果不错而且算法本身并不复杂。

Hopcroft-Karp算法是Hopcroft和Karp在1972年提出的,该算法的主要思想是在每次增广的时候不是找一条增广路而是同时找几条点不相交的最短增广路,形成极大增广路集,随后可以沿着这几条增广路同时进行增广。

可以证明在寻找增广路集的每一个阶段所寻找到的最短增广路都具有相等的长度,并且随着算法的进行最短增广路的长度是越来越长的,更进一步的分析可以证明最多只需要增广ceil(sqrt(n))次就可以得到最大匹配(证明在这里略去)。

因此现在的主要难度就是在O(e)的时间复杂度内找到极大最短增广路集,思路并不复杂,首先从所有X的未盖点进行BFS,BFS之后对每个X节点和Y节点维护距离标号,如果Y节点是未盖点那么就找到了一条最短增广路,BFS完之后就找到了最短增广路集,随后可以直接用DFS对所有允许弧(dist[y]=dist[x]+ 1,可以参见高流推进HLPP的实现)进行类似于匈牙利中寻找增广路的操作,这样就可以做到O(m)的复杂度。

二分图最大匹配及常用建图方法

二分图最大匹配及常用建图方法

算法———艺术二分图匹配剖析很多人说,算法是一种艺术.但是对于初学者地我,对算法认识不是很深刻,但偶尔也能感受到他强大地魅力与活力.这让我追求算法地脚步不能停止.下面我通过分析匈牙利算法以及常用建图方式,与大家一起欣赏算法地美.匈牙利算法匈牙利算法是用来解决最大二分图匹配问题地,所谓二分图即“一组点集可以分为两部分,且每部分内各点互不相连,两部分地点之间可以有边”.所谓最大二分图匹配即”对于二分图地所有边,寻找一个子集,这个子集满足两个条件,:任意两条边都不依赖于同一个点.:让这个子集里地边在满足条件一地情况下尽量多. 首先可以想到地是,我们可以通过搜索,找出所有地这样地满足上面条件地边集,然后从所有地边集中选出边数最多地那个集合,但是我们可以感觉到这个算法地时间复杂度是边数地指数级函数,因此我们有必要寻找更加高效地方法.目前比较有效地方法有匈牙利算法和通过添加汇点和源点地网络流算法,对于点地个数都在到之间地数据,我们是采取匈牙利算法地,因为匈牙利算法实现起来要比网络流简单些.下面具体说说匈牙利算法:介绍匈牙利之前,先说说“增广轨”.定义:若是图中一条连通两个未匹配顶点地路径,并且属最大匹配边集地边和不属地边(即已匹配和待匹配地边)在上交替出现,则称为相对于地一条增广轨定义总是抽象地下面通过图来理解它.图中地线段(>, >, >)便是上面所说地路径,我们假定边()是以匹配地边,()()是未匹配地边,则边()边()和边()在路径上交替地出现啦,那么就是相对于地一条增广轨,这样我们就可以用边和边来替换边那么以匹配地边集数量就可以加,.匈牙利算法就是同过不断地寻找增广轨实现地.很明显如果二分图地两部分点分别为和,那么最大匹配地数目应该小于等于(); 因此我们可以枚举任第一部分(地二部分也可以)里地每一个点,我们从每个点出发寻找增广轨,最后吧第一部分地点找完以后,就找到了最大匹配地数目,当然我们也可以通过记录找出这些边.下面给出关于二分图最大匹配地两个定理:最大匹配数最大独立集:二分图地最小覆盖数最大匹配数:最小路径覆盖最大独立集最大独立集是指求一个二分图中最大地一个点集,该点集内地点互不相连.最小顶点覆盖是指在二分图中,用最少地点,让所有地边至少和一个点有关联.最小路径覆盖是指一个不含圈地有向图中,地一个路径覆盖是一个其结点不相交地路径集合,图中地每一个结点仅包含于中地某一条路径.路径可以从任意结点开始和结束,且长度也为任意值,包括下面给出二分图最大匹配地伪代码:*[] 数组时标记第二部分点中地第个点是否使用过.[] 与第二部分中地点匹配地点是[]*( ) 通过这个点寻找增广轨,找到返回找不到返回;←[] . ; 与相连地点;(){[] 点没有被使用过[] ([]) 点没有和另一部分地点配对或和配对地那个点可以找到其它点和他配对(找到增广轨);← . 与相连地下几个点};} ;我们只需要在主程序中对某一部分点集地每个点进行增广轨地寻找;{←→枚举第一部分地个点;→[] ←把第二部分地个点表示为没有使用过.()←找到增广轨就给边数加一;}程序非常好写,也非常好懂.每次我们从上面地第个点出发尽量去找一个能唯一和它匹配地点,策略有两种,一是直接在下面地点中找到一个点,他没有和上面地点匹配过(即[] ).二是当和上面地某个点匹配过,即([])那么我们就从[]出发,去给他找下面另外地点和他匹配,把点留给点.这样我们不就多找到了一条?然而对于匈牙利算法来说,难点并不在与程序本身,而是在如何把实际问题转化为最大二分图匹配地模型,然后再利用匈牙利算法解决. 下面我们说几种常见地建图模型.常见建图模型法一行列匹配法上图是一个* 地矩阵,方格内地表示这个地方有敌人,表示没有敌人,现在我们有很多箭,每根箭可以杀死一行或者一列地敌人,问题是,我们要杀死所有地敌人至要用到几根箭?初看似乎和最大二分图没有什么相关联地,然而如果我们转换一下视角,这样思考:我们要杀死某个敌人,只要让他所在地位置有箭经过就行.也就是所有地位置都被箭覆盖就行,对就是覆盖,就是顶点地最小覆盖,既然是顶点地最小覆盖,而且我们要杀地是敌人,那么我们地点就应该是敌人地位子,即(行列)对于上面那个图我么可以建立下面这个模型有人在地坐标是()我们就用这几个点地横纵坐标建图(每个点地横坐标是第一部分,纵坐标是另一部分,被边相连地两个数字表示一个点)上面我们说过,一个二分图地最小顶点覆盖就是要找到最少地边把所有地顶点覆盖,正好符合这个题地要求,上面还给出了一个性质,即二分图地最小顶点覆盖是等于二分图地最大匹配.所以我们只需要对上面地那个二分图就最大匹配就行,这样把原本地问题转变地很简单了.法二黑白染色法又是一个图,要求是把方格里地所有地改为零,一次最多只能修改相邻地两个,为最少需要修改几次?有是一个求最值得问题,但是似乎用于求最值地算法(贪心,动态规划……)都派不上用场,既然在这里提出,那么他肯定能用二分图最大匹配解决,关键是如何建图?既然是每次只能拿相邻地两个,是两个,正好我们匹配地时候也是找两个进行匹配,这是否就是这个题和最大二分图匹配相联系地地方呢?对就是这里.但是每个点能和他四周地四个点匹配,那么我们怎么把所有地点分成来那个部分呢?对就是要把第个点放到第一部分,第个点周围地四个点放到第二部分,再把这四个点周围地点放到第部分有了这样地思想,我们只需对原图做这样地改动:黑白染色使四周和中间地颜色不同.图中黑白地意思是就是把点分类,图里地表示地就是上面那个图地地个数然后建图,把相邻地点相连,比如说和和.......白色黑色然后要把所有一改为零,也就是要对每个点都操作,每个点都要有,那不就是最小顶点覆盖吗?对,这个问题有解决了.法三反建法问题背景:一个极度封建地老师要带同学们出去玩,但是他怕在途中同学之间发生恋情老师研究了一下发现,满足下面几种条件地两个同学之间发生恋情地可能性很小》身高差> >性别相同》爱好不同地音乐>爱好同类型地运动显然如果我们用满足上面条件地同学之间建边那么最后建立起来地就不是二分图了.稍微观察一下,男生之间我们是随便带地,女生也是,因为他们彼此性别相同.因此我们就可以把男女分为两部分,那么男女之间如何建边?如果我们把男女满足不发生恋情地连起来,那么求出来地最大匹配没有代表性,不能得到我们想要地结果.因此我们用反建法,把男女中可能发生恋情地建立边.也就是说把身高差< 或爱好相同音乐或爱好不同类型运动地男女同学之间用边连起来. 然后求一个最大独立集,最大独立集地原则不就是找到一个点集,使得集合内地点互不相连且点尽量多吗?我们把可能发生恋情地男女相连,那么最大独立集不就是我们要找地不可能发生恋情地人地集合吗?那么,这个问题解决了!法四拆点法拆点法是用于解决最小路径覆盖问题地,给出一个图要找到几条路径,可以把所有地点经过,并且路径之间不可以交叉.我们地做法是把点拆成两部分(点拆为. 点拆为……)如果我们对这个图求二分图地最大匹配,你会发现每个匹配对应着一个路径覆盖,因此,此二分图地最大匹配即:原图中地最小路径覆盖上地边地个数(路径是由条,条或多条边组成地).那么原图地最小路径覆盖数原图顶点数–最小路径上地边数也就是原图地最小路径覆盖数原图顶点数–二分图最大匹配数.法五一行变多行,一列变多列示墙,我们要在表格内没有墙地地方建立碉堡,而且要保证任何两个碉堡之间互相不能攻击,问最多能建多少个碉堡?是否感觉像第一个题呢?如果我们向第一个题那样建图,那么最后求出来地最大匹配也就是行和列地匹配.而且这个匹配满足了所有匹配都是不同行不同列(匹配本身地性质就是每个点至多属于匹配中地某个边).但是这样地建图地话,我们墙怎么处理?有墙地地方就相当于把这一行和这一列分成了两行,两列.例如等价于还是一行等价于和一行变成了两行对就是这么分地.原图(因为上面有了二行固只能从第三行开始)(因为第一列有了墙,固列数增加为)(第列有了墙,固列数增加到了和)一行变多行,一列变多列后地图然后我们按照这个编号见图即可对这个图求二分图最大匹配即可.这个问题也解决了!一个应用于求二分图匹配地算法—匈牙利算法,巧妙地应用找增广轨地方式,使得求二分图最大匹配即变得高效,而且也变得容易理解,这就有了艺术地感觉,然而,一个应用于二分图地操作,却可以把其他看似和二分图没关系地事情,通过巧妙地,艺术性地手笔转化为二分图问题,这是多么地美妙.算法是很神奇地东西,总是让人摸不着头脑,当你认为自己对某种算法很熟悉地时候,你总会立即发现其实你只是对他有了一点点认识,这就是算法.。

二分图匹配及其应

二分图匹配及其应
• 结论:Kuhn-Munkres算法的总时间复杂度为O(n3)
编辑课件
例题1. Beloved Sons (SGU210)
• 国王有N个儿子,另外有N漂亮的女孩,每 个儿子喜欢其中的某些。国王对每个儿子 有一个喜爱程度。
• 要把王子和这些女孩配对(不一定完全配 对),使得所有被配对的王子被喜爱程度 值的平方和尽可能大。
• 所以国王喜欢程度较低的男孩子进入匹配 不可能对喜欢程度较高的孩子是否在匹配 中产生任何影响:这就是贪心算法成立的 原因。
编辑课件
例题2. Dominoes(SGU190)
• 给定一个N×N的棋盘,其中有一些格子被 移除。要求在剩下的棋盘中放置互不重叠 的1×2的骨牌,将棋盘盖满。
编辑课件
分析
0
存在增1广路0却找不到吗?
10
1
10 编辑课件
匈牙利树
增广路定理的证明
• 必要性. 如果存在则增广后得到更大匹配. • 充分性. 如果M不是最大匹配, 取最大匹配
M’, 作M’和M的对称差G’, 则G’在M’中的边 应比M’中更多. G’有三种可能的连通分支
– 孤立点. 当某边(u,v)同时属于两个匹配, 则u和v 都是孤立点.
(A) A
• 必要性. 若存在A使得右边>左边, 则A无法全部匹配
• 充分性. 假设G的最大匹配M不是完全匹配, 一定存 在结点X的结点x0关于M是非饱和点. 如果x0的邻集 为空, 则令A={x0}引出矛盾; 如果非空则其中每个结 点均为饱和点(否则会有增广路). 寻找与x0为端点 的关于M的一切交错路, 设其中Y结点的集合为Y’, X结点的集合为X’, 则Y’结点与X’-{x0}的结点一一对 应, 因此|X’|>|Y’|, 令A=X’引出矛盾.

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

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

2021/2/13
山东大学 软件学院
22
时间复杂度分析
令|S| = m,|T| = n,假设 m n。 找一条增广路(或判断不能找到)标号算法最多进行 O(mn)
次检查(因为最多有这么多条边)。 初始匹配最多被增广 m 次。 所以,总的计算量为 O(m2n)。
2021/2/13
山东大学 软件学院
2021/2/13
山东大学 软件学院
17
例子
1
6
2
72
3
82
4
9
5
10
找到一条增广路(2, 8)。更新M。
2021/2/13
山东大学 软件学院
18
例子
1
63
2
7
3
83
4
93
5
10 3
找到一条增广路(3, 10)。更新M。
2021/2/13
山东大学 软件学院
19
例子
2021/2/13
1 2 10 3 4 5
2021/2/13
山东大学 软件学院
4
例子
2021/2/13
山东大学 软件学院
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。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2018/8/11 山东大学 软件学院 11
通过增广路求二分图上的最大匹配
从图 G = (S, T, E)的任意一个匹配 M 开始,比如空集。 由 S 的一个未被匹配的顶点出发, 用一个系统方法搜索一条 M-增广路 P。 若 P 存在,则通过交换 P 在 M 和不在 M 中的边,便得到一 个其基数增加 1 的匹配。 然后从新的匹配开始,继续迭代,直到不存在 M-增广路, 则当前的匹配就是 G 的最大匹配。
2018/8/11
山东大学 软件学院
3
使用最大流算法求二分图上的最大匹配
给定二分图G = (V, U, E),构造流网络。 增加一个源点 s,从 s 到 V 中每个顶点引一条有向边。 增加一个目标顶点 t,从 U 中每个顶点向 t 引一条有向边。 E中的边均从 V 指向 U。 记得到的流网络为G’ = (V’, E’)。G’中的每条边均为单位容 量。 计算G’上从 s 到 t 的最大流。 E 中的饱和边即构成 G 上的一个最大匹配。
2018/8/11
山东大学 软件学院
4
例子
18/8/11
山东大学 软件学院
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。
2018/8/11
山东大学 软件学院
12
二分图上最大匹配的标号算法
输入:二分图 G = (S, T, E)。 输出:G 的最大匹配 M。 1 2 3 4 5 6 7
2018/8/11
M 。 对 S 中所有不在 M 中的顶点标号“” ,然后将这些顶点 都加入 Q。/* Q 是已标号但未检查的顶点的集合 */ while Q do 从 Q 中取出一个顶点 k,然后将 k 从 Q 中删除。 if k S then 对每条同 k 关联的边(k, j) M, 若 j 尚未被标号, 则给点 j 标号 k,并将 j 加入 Q。 else /* k T */
第6章 图与网络分析
6.7 最大匹配问题
2018/8/11
最大对集(匹配)问题
二分图的对集,基本概念,主要定理 二分图的最大匹配算法 二分图的带权重的最大匹配——分派问题及算法
2018/8/11
山东大学 软件学院
2
基本概念
图 G = (V, E)的对集 M:M 是 E 的子集,且 M 中任意两条边 均不相邻(都不共享顶点) 。 M-饱和点 i:V(M)中的顶点(i V(M),匹配的点) 。 M-非饱和点 i: V(M)之外的顶点 (i V(M), 没有匹配的点) 。 极大对集 M:不存在另外一个对集 M ,使得 M M 。 最大对集 M:不存在另外一个对集 M ,使得 M M 。 完美对集 M:对集 M,匹配了 G 上所有的点。
2018/8/11
山东大学 软件学院
8
顶点覆盖
2018/8/11
山东大学 软件学院
9
定理6.8.1
定理 6.8.1(Berge, 1957)图 G 中的一个匹配 M 是最大匹配当且 仅当 G 不包含 M-增广路。 (说明:G 是一般图,不要求是二分图。 ) 证:()。G 上若有 M-增广路,则可以使用这条路更新 M 得 到基数更大(多 1)的一个匹配,与 M 是最大匹配矛盾。 ()。假设 M 是一个匹配,图 G 上不含有 M-增广路,而 M 不 是最大匹配。 于是,存在 G 上另外一个匹配 M’,有|M’| > |M|。
山东大学 软件学院 13
二分图上最大匹配的标号算法
8 9 10 11 if k 在 M 中 then /* 此时有 k T V(M) */ 设(i, k)是关联于 i、 属于 M 的边 (此时 i S) 。 给点 i 标号 k,并将 i 加入 Q。 else /* 此时有 k T \ V(M) */ 终止在 k 的一条增广路被找到。从 k 开始, 反向追踪标号找到这条增广路 P,路的起 始顶点有标号“” 。 12 13 用增广路 P 更新 M。 删除 G 上所有的标号。重新对 S 中所有不 在 M 中的顶点标号“” ,然后将这些顶 点都加入 Q。 14
2018/8/11 山东大学 软件学院 6
证明
再由流守恒约束,V中每个顶点最多有一条出去的边流值为 1。同理,U中每个顶点最多有一条进来的边流值为1。 记M = {e E | e上的流值 > 0},因此M中的任何两条边均不 共享顶点,即,M是一个匹配,且|f*| = |M|。 因此,显然有|f*| |M|。
2018/8/11
山东大学 软件学院
7
基本概念
M -交错路:边在对集 M 和 E \ M 中交错出现的路。 M -增广路:起点和终点都不在 V(M)中的 M -交错路。 顶点覆盖 K:K 是 V(G)的子集,且 G 的每条边都至少有一 个端点在 K 中。 最小顶点覆盖 K:不存在另外一个覆盖 K’,使得 K K 。
2018/8/11
山东大学 软件学院
10
证明
令 H 是 G 上 M’M 的导出子图。 由于 H 中的每个顶点最多只能和 M 中的一条边以及 M’中的 一条边关联,因此 H 中每个顶点的度都不超过 2(都是 1 或 者 2) 。 因此,H 的每个连通分支或者是边在 M 和 M’中交错出现的 路,或者是边在 M 和 M’中交错出现的偶圈。 由于在 G 中有|M’| > |M|,而 H 是 M’和 M 的对称差,M’在 H 中的边数必然也 > M 在 H 中的边数。 这表明 H 中至少有一个连通分支,是一条起始于 M’中的边 又终止于 M’中的边的路。 由定义,这条路是一条 M-增广路,与给定条件矛盾。
相关文档
最新文档