求二部图 G 的最大匹配的算法(匈牙利算法), 其基本思想是:从 G 的任意匹配 M 开始,
对 X 中所有 M 的非饱和点, 寻找 M −增广路. 若不存在 M −增广路, 则 M 为最大匹配; 若存
在 M −增广路 P, 则将 P 中 M 与非 M 的边互换得到比 M 多一边的匹配 M
1
, 再对 M
1
重复上
述过程.
设 G = ( X, Y, E )为二部图, 其中 X = {x
1
, x
2
, … , x
n
}, Y = { y
1
, y
2
, … , y
n
}. 任取 G 的一初
始匹配 M (如任取 e∈E, 则 M = {e}是一个匹配).
① 令 S = φ , T = φ , 转向②.
② 若 M 饱和 X \ S的所有点, 则 M 是二部图 G 的最大匹配. 否则, 任取 M 的非饱和点
u∈X \ S , 令 S = S ∪{ u }, 转向③.
③ 记 N (S ) = {v | u∈S, uv∈E
}. 若 N (S ) = T, 转向②. 否则取 y∈N (S ) \ T. 若 y 是 M
的饱和点, 转向④, 否则转向⑤.
④ 设 x y∈M, 则令 S = S ∪{ x }, T = T ∪{ y }, 转向③.
⑤ u − y 路是 M−增广路, 设为 P, 并令 M = M⊕P, 转向①. 这里 M⊕P = M∪P \ M∩
P, 是对称差.
由于计算 M−增广路 P 比较麻烦, 因此将迭代步骤改为:
① 将 X 中 M 的所有非饱和点(不是 M 中某条边的端点)都给以标号 0 和标记*, 转向②.
② 若 X 中所有有标号的点都已去掉了标记*, 则 M 是 G 的最大匹配. 否则任取 X 中一
个既有标号又有标记*的点 x
i
, 去掉 x
i
的标记*, 转向③.
③ 找出在 G 中所有与 x
i
邻接的点 y
j
(即 x
i
y
j
∈E ), 若所有这样的 y
j
都已有标号, 则转向
②, 否则转向④.
④ 对与x
i
邻接且尚未给标号的y
j
都给定标号i. 若所有的y
j
都是M的饱和点, 则转向⑤,
否则逆向返回. 即由其中 M的任一个非饱和点y
j
的标号i找到x
i
, 再由x
i
的标号k 找到y
k
, … ,
最后由 y
t
的标号 s 找到标号为 0 的 x
s
时结束, 获得M −增广路 x
s
y
t
… x
i
y
j
, 记P = {x
s
y
t
, … ,
x
i
y
j
}, 重新记 M 为 M⊕P, 转向①.
⑤ 将 y
j
在 M 中与之邻接的点 x
k
(即 x
k
y
j
∈M), 给以标号 j 和标记*, 转向②.