匈牙利算法示例ppt
- 格式:ppt
- 大小:836.50 KB
- 文档页数:2
匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法,并推动了后来的原始对偶方法。
美国数学家哈罗德·库恩于1955年提出该算法。
此算法之所以被称作匈牙利算法,是因为算法很大一部分是基于以前匈牙利数学家Dénes Kőnig和Jenő Egerváry的工作之上创建起来的。
匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。
匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。
二分图:二分图又称作二部图,是图论中的一种特殊模型。
设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。
图一就是一个二分图。
匈牙利算法:匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。
匈牙利算法是基于Hall定理中充分性证明的思想,它是一种用增广路径求二分图最大匹配的算法。
Hall定理:二部图G中的两部分顶点组成的集合分别为X, Y; X={X1, X2, X3,X4, .........,Xm}, Y={y1, y2, y3, y4 , .........,yn}, G中有一组无公共点的边,一端恰好为组成X的点的充分必要条件是:X中的任意k个点至少与Y中的k个点相邻。
(1≤k≤m)匹配:给定一个二分图G,在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点,则称M是一个匹配。
图一中红线为就是一组匹配。
未盖点:设Vi是图G的一个顶点,如果Vi 不与任意一条属于匹配M的边相关联,就称Vi 是一个未盖点。
如图一中的a 3、b1。
设P是图G的一条路,如果P的任意两条相邻的边一定是一条属于M而另一条不属于M,就称P是一条交错路。
设G=(V,{R})是一个无向图。
如顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属两个不同的子集。
则称图G为二分图。
v给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配。
v选择这样的边数最大的子集称为图的最大匹配问题(maximal matching problem)v如果一个匹配中,图中的每个顶点都和图中某条边相关联,则称此匹配为完全匹配,也称作完备匹配。
最大匹配在实际中有广泛的用处,求最大匹配的一种显而易见的算法是:先找出全部匹配,然后保留匹配数最多的。
但是这个算法的复杂度为边数的指数级函数。
因此,需要寻求一种更加高效的算法。
匈牙利算法是求解最大匹配的有效算法,该算法用到了增广路的定义(也称增广轨或交错轨):若P是图G中一条连通两个未匹配顶点的路径,并且属M的边和不属M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M 的一条增广路径。
由增广路径的定义可以推出下述三个结论:v 1. P的路径长度必定为奇数,第一条边和最后一条边都不属于M。
v 2. P经过取反操作(即非M中的边变为M中的边,原来M中的边去掉)可以得到一个更大的匹配M’。
v 3. M为G的最大匹配当且仅当不存在相对于M的增广路径。
从而可以得到求解最大匹配的匈牙利算法:v(1)置M为空v(2)找出一条增广路径P,通过取反操作获得更大的匹配M’代替Mv(3)重复(2)操作直到找不出增广路径为止根据该算法,我选用dfs (深度优先搜索)实现。
程序清单如下:int match[i] //存储集合m中的节点i在集合n中的匹配节点,初值为-1。
int n,m,match[100]; //二分图的两个集合分别含有n和m个元素。
bool visit[100],map[100][100]; //map存储邻接矩阵。
bool dfs(int k){int t;for(int i = 0; i < m; i++)if(map[k][i] && !visit[i]){visit[i] = true;t = match[i];match[i] = k; //路径取反操作。
最大匹配之匈牙利算法模板。
要学习匈牙利算法先要懂得二部图的各种概念。
下面给出由o( _ )o MiYu 总结的普通性概念,这些概念很重要,一定要懂。
二分图的基本概念: ( 意思就是全部的点分成了2个集合 x, y. 每个集合中的顶点互相间没有边 ) 一个无向图 G = V, E , 假如存在两个集合X, Y, 使得X Y=V, X Y= , 并且每一条边e={x, y} 有x X,y Y, 则称G为一个二分图(bipartite graph). 常用来表示一个二分图. 若对X中任一x 及Y中任一y 恰有一边e E, 使e = {x, y}, 则称G为彻低二分图(complete bipartite graph). 二分图的性质: ( 交叉轨和增广路的概念很重要 ) 定理:无向图G为二分图的充分须要条件是,G起码有两个顶点,且其全部回路的长度均为偶数. 匹配:设G=为二分图,假如M&be;E,并且M中没有任何两边有公共端点。
M= 时称M为空匹配. 盖点: 若M是二分图的一个匹配, 将M中的边多所关联的顶点称为盖点, 其余则为未盖点. 交叉轨: 若一条路径上属于M的边和不属于M 的边交替浮现, 则称该路径为交叉轨. 增广路径: 若路径 P 是一条起始点和尽头都是未盖点的交叉轨, 那么 P 称为 M 的增广路径. 最大匹配: G的全部匹配中边数最多的匹配称为最大匹配. 性质1 : 一条关于M的增广路径的长度必为奇数, 且路上的第一条边和最后一条边都不属于M.性质2 : 对于一条关于M的增广路径 P, 将M 中属于P的边删去, 将P中不属于M 的边添加到M中,所得到的边集合计为 M P, 则 M P 比 M 多一条匹配边.性质3 : M 为 G 的一个最大匹配当且仅当不存在关于M的增广路径.hall 定理 : 对于二分图 G = ( X, Y, E ) , 存在一个匹配M, 使得 X 的全部顶点关于M饱和的充要条件是: 对 X 的任一子集A , 对A邻接的点集为P (A), 恒有 : | P[A] | = | A |其中性质 2 和性质 3 和 hall 定理的充分性证实就是匈牙利算法的基础 .. 二分图的最小顶点笼罩 ==== 最大匹配 DAG图的最小路径笼罩数 == 节点数最大匹配数二分图的最大自立集数 = 节点数最大匹配数在二分图中求最少的点,让每条边都起码和其中的一第1页共2页。
大意:已知两个图和两个图中的点和边的连接情况,求两个图中最多能连接的边的数目。
(每个点最多只能连接一条边)分析:算法总体可以采用类似于探索的方法,例如下面的这个图。
CADBE如这个有向图,共有5个结点A、B、C、D、E,A、B作为第一张图,C、D、E作为第二张图。
第一次DFS时先看A连接的点(顺序查找)是否已经有爹了,发现没有,那么爹变成了A,同时A的匹配找到了。
再找B的匹配,发现C已经有爹了即A,那么就试探A的下一个连接点发现没有爹且能与B相连,那么B的匹配也找到了,依次类推直到推到最后。
代码:function dfs(x:longint):boolean;vari:longint;beginif use[x] then exit(false);{如果出现某个点访问过返回false。
}use[x]:=true;{同时标记为已访问过。
}for i:=1 to m dobeginif (b[x,i]) and ((link[i]=0) or (dfs(link[i]))) then{如果要连的点还没爹可以连,或者是它的爹的所连的点还有剩余就可以继续(前提是必须可以相连)。
}beginlink[i]:=x;{修改爹。
}exit(true);end;end;exit(false);end;procedure XYL;vari:longint;beginfor i:=1 to n do{先进行查找。
}beginfillchar(use,sizeof(use),false);{初始化每个点都未访问过以便遍历图。
}if dfs(i) then inc(ans);{返回true说明可以匹配。
}end;writeln(ans);end;。
匈⽛利算法(⼆分图)---------------------------------------------------------------------题材⼤多来⾃⽹络,本篇由神犇整理基本概念—⼆分图⼆分图:是图论中的⼀种特殊模型。
若能将⽆向图G=(V,E)的顶点V划分为两个交集为空的顶点集,并且任意边的两个端点都分属于两个集合,则称图G为⼀个为⼆分图。
匹配:⼀个匹配即⼀个包含若⼲条边的集合,且其中任意两条边没有公共端点。
如下图,图3的红边即为图2的⼀个匹配。
1 最⼤匹配在G的⼀个⼦图M中,M的边集中的任意两条边都不依附于同⼀个顶点,则称M是⼀个匹配。
选择这样的边数最⼤的⼦集称为图的最⼤匹配问题,最⼤匹配的边数称为最⼤匹配数.如果⼀个匹配中,图中的每个顶点都和图中某条边相关联,则称此匹配为完全匹配,也称作完备匹配。
如果在左右两边加上源汇点后,图G等价于⼀个⽹络流,最⼤匹配问题可以转为最⼤流的问题。
解决此问的匈⽛利算法的本质就是寻找最⼤流的增⼴路径。
上图中的最⼤匹配如下图红边所⽰:2 最优匹配最优匹配⼜称为带权最⼤匹配,是指在带有权值边的⼆分图中,求⼀个匹配使得匹配边上的权值和最⼤。
⼀般X和Y集合顶点个数相同,最优匹配也是⼀个完备匹配,即每个顶点都被匹配。
如果个数不相等,可以通过补点加0边实现转化。
⼀般使⽤KM算法解决该问题。
3 最⼩覆盖⼆分图的最⼩覆盖分为最⼩顶点覆盖和最⼩路径覆盖:①最⼩顶点覆盖是指最少的顶点数使得⼆分图G中的每条边都⾄少与其中⼀个点相关联,⼆分图的最⼩顶点覆盖数=⼆分图的最⼤匹配数;②最⼩路径覆盖也称为最⼩边覆盖,是指⽤尽量少的不相交简单路径覆盖⼆分图中的所有顶点。
⼆分图的最⼩路径覆盖数=|V|-⼆分图的最⼤匹配数;4 最⼤独⽴集最⼤独⽴集是指寻找⼀个点集,使得其中任意两点在图中⽆对应边。
对于⼀般图来说,最⼤独⽴集是⼀个NP完全问题,对于⼆分图来说最⼤独⽴集=|V|-⼆分图的最⼤匹配数。