郁闷,csdn如何插公式?
独立集:设 I 是 G 的一个点子集,若 I 中任意两个顶点不相邻,则称 I是 G 的一个独立集。最大独立集,指点数最多的独立集。
根据定理,易知独立集与点覆盖互补。
算法分为若干阶段,每阶段包含若下步骤:
(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