二分图:又叫二部图,图G中顶点集V可以分成互不相交的子集(X,Y),并且图中的每一条边所关联的点分别属于两个不同的顶点集,则图G叫二分图。(不含奇环)
二分图的匹配:给定一个二分图G的子图M,M的边集中任意两条边都不依附于同一个顶点(点单独配对),则称M是一个匹配。
二分图的最大匹配:边数最大的一个匹配就是二分图的最大匹配。
看上去二分图匹配好像没有什么用途,但以下三个定理会有大用处:
1.二分图的最小点覆盖(x或y中的都行) = 最大匹配;
2.二分图的最大独立集 = 顶点数 - 最大匹配;
(最大独立集是从图中找出最多的顶点数并且顶点两两之间没有边)
3.有向无环图的最小路径覆盖 = 顶点数- 最大匹配。
二分图最大匹配——匈牙利算法
算法的思路是不停的寻找增广路(交错轨),并增加匹配的个数;增广轨的形式:第一条边未参与匹配,第二条边参与匹配,第三条边未参与匹配,...,最后一条边未参与匹配,显然它有奇数条边。那么对于这样一条路径,可以将它变为:第一条边参与匹配,第二条边未参与匹配,第三条边参与匹配,...,最后一条边参与匹配。匹配依然合法,但匹配数增加了一对。可以证明,当找不到增广轨时,就得到了最大匹配,这就是匈牙利算法的思路。
const int N = 50;
const int M = 50;
bool use[M]; //记录y中节点是否使用
int link[M]; //记录当前与y节点相连的x的节点:i未加入匹配时为link[i]==0
bool g[N][M]; //记录连接x和y的边,如果i和j之间有边则为1,否则为0
int gn,gm; //二分图中x和y中点的数目
bool find(int v) //对x中的结点v,找增广路径。
{
int i;
for(i = 1; i <= gm; i++) //对结点v发出的每条边
{
if(g[v][i] && !use[i])
{
use[i] = true;
//如果y中的结点i还没有加入到匹配中(link[i]==0),可直接连线;
//或者y加入到了匹配中,根据link[i]找到x中的结点v,根据v发出的边寻找另外一个未加入匹配结点y
//找到就记录到link中,返回true;找不到返回false(即找增广路径)。
if(link[i] == 0 || find(link[i]))
{
link[i] = v;
return true;
}
}
}
return false;
}
int MaxMatch() //找二分图的最大匹配数。
{
int i,ans=0;
for(i = 1; i <= gn; i++)
{
memset(use,0,sizeof(use));
if(find(i)) ans++;
}
return ans;
}
最小路径覆盖
在有向无环图G中,找出最小的路径条数,使之覆盖所有顶点,且任意一个顶点有且只有一条路径与之关联。从这可以看出:
1.一个单独的顶点是一条路径;
2.如果存在一条路径p1,p2,...,pk,其中p1为起点,pk为终点,那么在覆盖图中,p1,p2,...,pk这些顶点不再与其它的顶点之间存在有向边。
最小路径覆盖就是找出最小的路径条数,使之覆盖所有点。
最小路径覆盖数 = P - 最大匹配数。(G必须是无环的有向图)
其中最大匹配数的求法是把G中的每个顶点pi分成两个顶点pi与pi',如果G中存在一条pi到pj的边,那么在二分图G'中就有一条连接pi'与pj'的无向边;这里pi'就是G中pi的出边,pj'就是G中pj的一条入边。
可以这样理解:
匹配数为0,那么图G中不存在有向边,显然有最小覆盖数=P-0=P。
如果在G'中增加一条匹配边pi'-->pj',那么在图G中就有pi-->pj在一条路径上,于是覆盖的路径数减1,如此增加,直到二分图的最大匹配,也就求出了最小路径覆盖。
分享到:
相关推荐
整体来看,二分图匹配的知识点十分丰富,它不仅涵盖了图论中基础的图结构知识,还涉及到匹配理论、最大流理论以及高效算法的设计与实现。对于ACM编程竞赛中的图论题目,掌握二分图匹配的知识是解决许多问题的关键,...
二分图最优匹配是图论中的一个重要概念,它在许多实际问题中有着广泛的应用,比如分配问题、网络流问题、任务调度等。在本压缩包中,提供的是一组使用MATLAB语言实现的二分图最优匹配算法代码。MATLAB作为一种强大的...
二分图匹配是一种重要的...总之,二分图匹配及其算法在图论和计算机科学中有诸多应用,从简单的配对问题到复杂的网络优化,都离不开这一基础理论。理解和掌握匈牙利算法及其扩展应用,能够帮助我们更好地解决实际问题。
总的来说,二分图匹配是信息学竞赛中解决复杂问题的关键工具之一,它要求参赛者具备扎实的图论基础,良好的建模能力,以及灵活运用算法解决问题的技巧。通过学习和掌握二分图匹配,参赛者能够在面对各类优化问题时...
标题中的“matlab实现匈牙利算法二分图最大匹配的程序”指的是使用MATLAB编程语言来实现一种经典的图论算法——匈牙利算法,它主要用于解决二分图的最大匹配问题。二分图是一种特殊的图,其中的节点可以分为两个不...
### 二分图匹配 #### 一、基础知识与概念 **二分图**是一种特殊的图类型,其中顶点被划分为两个互不相交的集合(通常标记为X和Y),并且图中的每条边都连接来自不同集合的顶点。这种结构在计算机科学和数学中有...
二分图匹配是一种在计算机科学特别是在图论领域中的基础问题,它主要涉及图的两个集合的顶点,并且图中每条边连接的两个顶点分别位于这两个不同的顶点集中。在信息学竞赛中,二分图匹配问题经常被作为题目的核心部分...
### 二分图的最优匹配算法(KM算法) #### 算法背景及应用场景 ...KM算法是解决二分图最大权匹配问题的有效工具,其理论基础坚实且实际应用广泛。通过不断优化算法实现,可以在实际场景中更高效地解决问题。
### 匈牙利算法在二分图最大匹配中的应用 #### 一、引言 匈牙利算法是一种高效地解决二分图最大匹配问题的方法。它最初由Kőnig和Egerváry在20世纪30年代提出,并在后续的研究中不断完善。该算法不仅具有较高的...
【图的匹配】是图论中...总之,图的匹配和二分图是图论中的基础概念,它们在算法设计和优化问题中有着广泛的应用。理解这些概念及其算法,对于解决实际问题,尤其是在计算机科学和数学竞赛(如ACM)中,具有重要意义。
二分图的最大匹配问题是寻找二分图中最多的一对对顶点,使得每对顶点之间有一条边相连,且任意两对顶点间的边不相交。这个问题在实际中有多种应用,比如婚姻匹配、作业分配、网络路由等。 匈牙利算法是解决二分图...
### 二分图最大匹配KM算法详解 #### KM算法概览 KM算法(Kuhn-Munkres Algorithm),也称为匈牙利算法的扩展版本,主要用于解决带权二分图的最佳匹配问题。简单来说,二分图是一种特殊的图结构,它可以被划分为两个...
二分图的最大匹配,匈牙利算法,最小点覆盖,DAG图的最小路径覆盖。二分图的最大独立集.二分图最优匹配.noi,acm,基础
二分图则是图论中的一个基础概念,具有广泛的应用,如匹配问题、网络流问题、社交网络分析等。在这个主题中,我们将深入探讨二分图及其判定方法。 二分图,也称为二部图或二分图解,是图的一个特殊类型。在二分图中...
- 图2展示了在这个匹配基础上找到的一条增广路径:3->6->2->5->1->4。 - 通过这条增广路径,将非匹配边(3->6, 2->5, 1->4)加入到匹配集合中,并移除匹配边(1->5, 2->6),得到新的匹配:[3, 6], [2, 5], [1, 4]。...
- **增广路径**:在一个二分图的当前匹配基础上,一条从左部未匹配节点到右部未匹配节点的路径,该路径满足以下条件: - 路径长度为奇数。 - 路径上的点交替地来自左右两个子集。 - 路径上的边交替地不在当前匹配...
二分图是图论中的一个重要概念,它是图论研究的基础之一,广泛应用于计算机科学、运筹学、社会科学等多个领域。本资料"图论- 二分图.rar"包含的PDF文档详细介绍了二分图的基本理论及其应用。 首先,我们要了解什么...
题目E "二分图关系增长" 提到的是一种二分图匹配优化问题,需要在已知匹配方案的基础上找到最大化匹配权值的增长,并确定最小改动的边数。这类问题通常需要运用匈牙利算法或者Kuhn-Munkres算法等高级技术进行求解,...
二分图是图论中的一个重要概念,它在计算机科学,特别是算法设计中有着广泛的应用。在二分图中,图的顶点可以被分成两个不相交的集合...通过研究这些材料,你可以更好地掌握二分图的理论基础,提高解决实际问题的能力。