无法理解Hopcroft-Karp算法以获得最大匹配

时间:2014-01-03 09:10:05

标签: algorithm graph depth-first-search breadth-first-search

以下是此算法的伪代码(source):

/*
 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

我正在尝试决定每个变量应该是什么。代码中的G1G2似乎与G的大小相同,但它们已初始化为NIL。但是,在BFS算法中,究竟是什么Adj[v]?在典型的图表场景中,这会是什么类似的?

1 个答案:

答案 0 :(得分:0)

Adj[v]表示v的邻接列表,即其相邻顶点的列表。 G1G2是图表的分区。由于Hopcroft-Kapr算法用于二分图,因此解决方案表明图形分为两个分区,即G1G2