📅  最后修改于: 2023-12-03 15:10:35.323000             🧑  作者: Mango
最大匹配(maximum matching)问题是图论中重要的基础问题之一,算法通常被用于解决匹配问题,如 Job Assignment、Hospitals-Residents 等。Hopcroft-Karp 算法是解决最大匹配问题的常用算法之一,由 Hopcroft 和 Karp 提出,时间复杂度为 $O(\sqrt{n} m)$。
Hopcroft-Karp算法是建立在增广路的基础上的,步骤如下:
Hopcroft-Karp算法在增广路径的搜索上采用广度优先搜索(BFS)算法,但是BFS难以在高度多的图上快速地搜索到增广路径。为此,Hopcroft-Karp 算法利用了图的二分性质,将顶点V分为左右两个部分 U 和 V,以便更快地找到增广路。
Hopcroft-Karp 算法将左侧的顶点U称为未匹配顶点(unmatched vertex),将右侧的顶点V称为已匹配顶点(matched vertex)。通过一次搜索,找到一条已匹配顶点 u 的邻居 v,使得顶点 v 是一个未匹配顶点。这样一来,就可以增大匹配的大小。如果找不到这样的邻居,就表明当前匹配是最大的。
Hopcroft-Karp 算法的核心思想是寻找增广路(augmenting path)。增广路是指从未匹配顶点u开始,视交替路上的匹配边/未匹配边交替变换,最终到达无法继续交替的未匹配顶点v的路径,此时路径上的未匹配边数量比匹配边多1。
Hopcroft-Karp 算法 在寻找增广路时,将匹配结果记录下来,以便能够较快地判断某个点是否已经匹配。
Hopcroft-Karp 算法实现的伪代码如下:
# Hopcroft-Karp 算法伪代码
input: bipartite graph G = (V, E)
output: the maximum matching M of G
function Hopcroft-Karp(G)
for each vertex v in G do
partition v into left and right vertices
if v is unmatched then
add v to T
repeat
S ← {} /* set of left vertices reachable from paths in augmenting paths of length
1,3,5,... starting in T */
for all u in T do
for all (u, v) ∈ E do
if v is unmatched then
add v to S
if S = {} then
return M
P ← {} /* set of paths in augmenting paths of length 2,4,6,... starting in T
and ending in S*/
for all s in S do
if FindAugmentingPath(s) then
add path to P
if P = {} then
return M
for each path p in P do
AugmentPath(p,M)
end function
Hopcroft-Karp 算法在解决最大匹配问题上比较优秀,其核心思想是利用增广路来增大匹配的大小,算法实现上通过广度优先搜索在图中寻找增广路。算法时间复杂度为 $O(\sqrt{n} m)$,比很多其他算法的复杂度都低。