Edmondsův–Karpův algoritmus Edmondsův-Karpův algoritmus je v informatice a teorii grafů implementací Fordovy-Fulkersonovy metody pro výpočet maximálního toku v síti s časovou složitostí . Je asymptoticky pomalejší než Goldbergův algoritmus s časovou složitostí , ale v praxi je rychlejší pro řídké grafy. Dinic, ruský vědec, publikoval algoritmus poprvé v roce 1970[1] nezávisle na publikování stejného algoritmu Kanaďanem Jackem Edmondsem a Američanem Richardem Karpem v roce 1972[2] (údajně objeven dříve). Dinicův algoritmus obsahuje navíc techniky, které redukují časovou složitost na .
Algoritmus
Algoritmus je téměř identický s Fordovým-Fulkersonovým algoritmem, až na to, že je definováno pořadí výběru zlepšující cesty v případě existence většího počtu zlepšujících cest. Vybraná zlepšující cesta musí být vždy nejkratší možná. Pro důkaz korektnosti a časové složitosti jsou podstatné následující vlastnosti:
- délka nalezené zlepšující cesty v průběhu algoritmu nikdy neklesá
- je-li v aktuálním kroku algoritmu měněn tok hranou jejíž tok byl měněn v některém z předchozích kroků, pak je délka zlepšující cesty v aktuálním kroku ostře větší než v příslušném kroku předchozím
- cesta ze zdroje do spotřebiče je nejvýše V dlouhá a lze ji nalézt v čase
.
Důkaz je dostupný v.[3]
Pseudokód
- Pro podrobnější popis vizte Fordův-Fulkersonův algoritmus.
algorithm EdmondsKarp
input:
C[1..n, 1..n] (Matice kapacit)
E[1..n, 1..?] (Seznam sousedů)
s (Zdroj)
t (Spotřebič)
output:
f (Hodnota maximálního toku)
F (Matice dávající korektní tok s maximální hodnotou)
f := 0 (Na začátku je tok nula)
F := array(1..n, 1..n) (Reziduální kapacita z u do v je C[u,v] - F[u,v])
forever
m, P := BreadthFirstSearch(C, E, s, t)
if m = 0
break
f := f + m
(Vyhledává backtrackingem a vypisuje tok)
v := t
while v ≠ s
u := P[v]
F[u,v] := F[u,v] + m
F[v,u] := F[v,u] - m
v := u
return (f, F)
algorithm BreadthFirstSearch
input:
C, E, s, t
output:
M[t] (Kapacita nalezené cesty)
P (Parent table)
P := array(1..n)
for u in 1..n
P[u] := -1
P[s] := -2 (ujistěte se, že zdroj není objeven podruhé)
M := array(1..n) (Kapacita nalezené cesty k vrcholu)
M[s] := ∞
Q := queue()
Q.push(s)
while Q.size() > 0
u := Q.pop()
for v in E[u]
(Jestli je dostupná kapacita a v ještě nebylo nalezené)
if C[u,v] - F[u,v] > 0 and P[v] = -1
P[v] := u
M[v] := min(M[u], C[u,v] - F[u,v])
if v ≠ t
Q.push(v)
else
return M[t], P
return 0, P
Příklad
Je daná síť o sedmi vrcholech, zdrojem A, spotřebičem G a kapacitami jako na obrázku:
Dvojice na hranách reprezentují současný tok a kapacitu . Dostupná kapacita hrany z vrcholu do vrcholu je , tedy celková kapacita minus použitý tok. Je-li tok hranou z vrcholu do vrcholu záporný, přičítá se ke kapacitě.
Kapacita
|
Cesta
|
Výsledná síť
|



|
|
 |



|
|
 |



|
|
 |



|
|
 |
Všimněte si, jak se délka zlepšující cesty nalezené algoritmem nikdy nezmenšuje. Nalezené cesty jsou nejkratší možné. Nalezený tok se rovná kapacitě přes minimální řez v grafu oddělující zdroj a spotřebič. V tomto grafu je pouze jeden minimální řez, rozdělující vrcholy na množiny a s kapacitou .
Reference
- ↑ E. A. Dinic. Algorithm for solution of a problem of maximum flow in a network with power estimation. Soviet Math. Doklady. 1970, čís. Vol 11, s. 1277–1280.
- ↑ Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest a Clifford Stein. Introduction to Algorithms. [s.l.]: MIT Press and McGraw-Hill, 2001. (Second edition). ISBN 0-262-53196-8. Kapitola 26.2, s. 660–663.
- ↑ EDMONDS, Jack; KARP, Richard M. Theoretical improvements in algorithmic efficiency for network flow problems. Journal of the ACM. 1972, čís. 19, s. 248–264. 2. vydání. Dostupné online [cit. 2007-03-26].
Externí odkazy
|