最大匹配的Hopcroft-Karp算法

郁闷,csdn如何插公式?

独立集:设 是 一个点子集,若 中任意两个顶点不相邻,则称 I是 一个独立集。最大独立集,指点数最多的独立集。

根据定理,易知集与点覆盖互补

算法分为若干阶段,每阶段包含若下步骤:

(1将左侧未匹配点集设为起点,按照交错路径的条件,BFS,对图分层,在某层出现未匹配的右边点时停

(2)将左侧未匹配点集设为起点,按照层的顺序,和交错路径的条件,DFS

(3复杂度:

算法分析:

(1在二分图 G = (V; E) 中每个阶段的复杂度为 O(),使最短交错路径增长1

(2个阶段后,最短交错路径不小于

(3设当前匹配为 M,取的一个最大匹配 ,构造图

(4)图 G∗ 至多包含条交错路径,即至多再执行阶段,算法结束

(5综上,算法最坏复杂度为

伪代码:

/*
 G = G1 ∪ G2 ∪ {NIL}
 where G1 and G2 are partition of graph and NIL is a special null vertex
*/
  
function BFS ()
    for v in G1
        if Pair_G1[v] == NIL
            Dist[v] = 0
            Enqueue(Q,v)
        else
            Dist[v] = ∞
    Dist[NIL] = ∞
    while Empty(Q) == false
        v = Dequeue(Q)
        if Dist[v] < Dist[NIL] 
            for each u in Adj[v]
                if Dist[ Pair_G2[u] ] == ∞
                    Dist[ Pair_G2[u] ] = Dist[v] + 1
                    Enqueue(Q,Pair_G2[u])
    return Dist[NIL] != ∞
function DFS (v)
    if v != NIL
        for each u in Adj[v]
            if Dist[ Pair_G2[u] ] == Dist[v] + 1
                if DFS(Pair_G2[u]) == true
                    Pair_G2[u] = v
                    Pair_G1[v] = u
                    return true
        Dist[v] = ∞
        return false
    return true
function Hopcroft-Karp
    for each v in G
        Pair_G1[v] = NIL
        Pair_G2[v] = NIL
    matching = 0
    while BFS() == true
        for each v in G1
            if Pair_G1[v] == NIL
                if DFS(v) == true
                    matching = matching + 1
    return matching


你可能感兴趣的:(算法,图)