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 nezávisle na publikování stejného algoritmu Kanaďanem Jackem Edmondsem a Američanem Richardem Karpem v roce 1972 (ú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.

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: 300px

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íť 300px</td> 300px</td> 300px</td> 300px</td>

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

Externí odkazy

Algorithms and Complexity (strany 63 – 69)

Kategorie:Toky v sítích