📜  最大匹配的 Hopcroft–Karp 算法第 1 套(介绍)(1)

📅  最后修改于: 2023-12-03 15:10:35.323000             🧑  作者: Mango

Hopcroft-Karp算法介绍

算法背景

最大匹配(maximum matching)问题是图论中重要的基础问题之一,算法通常被用于解决匹配问题,如 Job Assignment、Hospitals-Residents 等。Hopcroft-Karp 算法是解决最大匹配问题的常用算法之一,由 Hopcroft 和 Karp 提出,时间复杂度为 $O(\sqrt{n} m)$。

算法流程

Hopcroft-Karp算法是建立在增广路的基础上的,步骤如下:

  1. 初始化匹配为empty。
  2. 当存在增广路时,将增广路上的边反转。
  3. 最终匹配就是反转边剩余的单向边。

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)$,比很多其他算法的复杂度都低。