匈牙利算法

时间:2024-11-22 03:53:12编辑:思创君

什么是匈牙利算法?Hall定理是什么

谈匈牙利算法自然避不开Hall定理,即是:对于二部图G,存在一个匹配M,使得X的所有顶点关于M饱和的充要条件是:对于X的任意一个子集A,和A邻接的点集为T(A),恒有: │T(A)│ >= │A│
匈牙利算法是基于Hall定理中充分性证明的思想,其基本步骤为:
1.任给初始匹配M;
2.若X已饱和则结束,否则进行第3步;
3.在X中找到一个非饱和顶点x0,作V1 ← {x0}, V2 ← Φ;
4.若T(V1) = V2则因为无法匹配而停止,否则任选一点y ∈T(V1)\V2;
5.若y已饱和则转6,否则做一条从x0 →y的可增广道路P,M←M?E(P),转2;
6.由于y已饱和,所以M中有一条边(y,z),作 V1 ← V1 ∪{z}, V2 ← V2 ∪ {y}, 转4;


设数组up[1..n] --- 标记二分图的上半部分的点。
down[1..n] --- 标记二分图的下半部分的点。
map[1..n,1..n] --- 表示二分图的上,下部分的点的关系。
True-相连, false---不相连。
over1[1..n],over2[1..n] 标记上下部分的已盖点。
use[1..n,1..n] - 表示该条边是否被覆盖 。

首先对读入数据进行处理 ,对于一条边(x,y) ,起点进集合up,终点进集合down。 标记map中对应元素为true。

1. 寻找up中一个未盖点 。
2. 从该未盖点出发 ,搜索一条可行的路线 ,即由细边出发, 由细边结束, 且细粗交错的路线 。
3. 若找到 ,则修改该路线上的点所对应的over1,over2,use的元素。重复步骤1。
4. 统计use中已覆盖的边的条数total,总数n减去total即为问题的解。


匈牙利算法具体怎么操作啊

匈牙利算法(Edmonds算法)步聚:(1)首先用(*)标记X中所有的非M顶点,然后交替进行步骤(2),(3)。(2)选取一个刚标记(用(*)或在步骤(3)中用(yi)标记)过的X中顶点,例如顶点xi,如果xi与y为同一非匹配边的两端点,且在本步骤中y尚未被标记过,则用(xi)去标记Y中顶点y。重复步骤(2),直至对刚标记过的X中顶点全部完成一遍上述过程。(3)选取一个刚标记(在步骤(2)中用(xi)标记)过的Y中结点,例如yi,如果yi与x为同一匹配边的两端点,且在本步骤中x尚未被标记过,则用(yi)去标记X中结点x。重复步骤(3),直至对刚标记过的Y中结点全部完成一遍上述过程。 (2),(3)交替执行,直到下述情况之一出现为止: (I)标记到一个Y中顶点y,它不是M顶点。这时从y出发循标记回溯,直到(*)标记的X中顶点x,我们求得一条交替链。设其长度为2k+1,显然其中k条是匹配边,k+1条是非匹配边。(II)步骤(2)或(3)找不到可标记结点,而又不是情况(I)。 (4)当(2),(3)步骤中断于情况(I),则将交替链中非匹配边改为匹配边,原匹配边改为非匹配边(从而得到一个比原匹配多一条边的新匹配),回到步骤(1),同时消除一切现有标记。(5)对一切可能,(2)和(3)步骤均中断于情况(II),或步骤(1)无可标记结点,算法终止(算法找不到交替链).

以上算法说穿了,就是从二分图中找出一条路径来,让路径的起点和终点都是还没有匹配过的点,并且路径经过的连线是一条没被匹配、一条已经匹配过交替出现。找到这样的路径后,显然路径里没被匹配的连线比已经匹配了的连线多一条,于是修改匹配图,把路径里所有匹配过的连线去掉匹配关系,把没有匹配的连线变成匹配的,这样匹配数就比原来多1个。不断执行上述操作,直到找不到这样的路径为止。


上一篇:油压碟刹

下一篇:没有了