Algoritmus Edmonds – Karp - Edmonds–Karp algorithm
v počítačová věda, Algoritmus Edmonds – Karp je implementace Ford-Fulkersonova metoda pro výpočet maximální průtok v toková síť v čas. Algoritmus poprvé publikoval Yefim Dinitz (jehož jméno je také přepsáno „E. A. Dinic“, zejména jako autor jeho raných článků) v roce 1970[1][2] a nezávisle publikoval Jack Edmonds a Richard Karp v roce 1972.[3] Dinicův algoritmus zahrnuje další techniky, které snižují dobu běhu na .[2]
Algoritmus
Algoritmus je totožný s Algoritmus Ford-Fulkerson, kromě toho, že pořadí hledání při hledání rozšiřující cesta je definováno. Nalezená cesta musí být nejkratší cestou, která má dostupnou kapacitu. To lze najít pomocí a vyhledávání na šířku, kde na každou hranu aplikujeme váhu 1. Provozní doba je nalezen tím, že ukazuje, že každou rozšiřující cestu lze najít v čas, že pokaždé, když alespoň jeden z hrany jsou nasycené (hrana, která má maximální možný tok), že vzdálenost mezi nasycenou hranou a zdrojem podél rozšiřující dráhy musí být delší než naposledy, kdy byla nasycena, a že délka je maximálně . Další vlastností tohoto algoritmu je to, že délka nejkratší rozšiřující dráhy se monotónně zvyšuje. K dispozici je přístupný důkaz Úvod do algoritmů.[4]
Pseudo kód
algoritmus EdmondsKarp je vstup: graf (graf [v] by měl být seznam hran vycházejících z vrcholu v v původní graf a jejich odpovídající konstruované zadní hrany které se používají pro zpětný tok. Každá hrana by měla mít kapacitu, průtok, zdroj a jímku jako parametry, a také ukazatel na zadní hranu.) s (Zdrojový vrchol) t (Sink vertex) výstup: tok (Hodnota maximálního průtoku) průtok: = 0 (Inicializovat tok na nulu) opakovat (Spusťte vyhledávání na šířku (bfs) a najděte nejkratší cestu s-t. Používáme 'pred' k uložení hrany, kterou jsme dostali, abychom se dostali ke každému vrcholu, abychom mohli cestu později obnovit) q: = fronta() q.push (s) pred: = pole(délka grafu) zatímco ne empty (q) cur: = q.pull () pro Edge e v graf [aktuální] dělat -li pred [e.t] = nula a e.t ≠ s a e.cap> e.flow pak pred [e.t]: = e q.push (e.t) -li ne (pred [t] = null) pak (Našli jsme rozšiřující cestu. Podívejte se, kolik toku můžeme poslat) df: = ∞ pro (e: = pred [t]; e ≠ null; e: = pred [e.s]) dělat df: = min(df, e.cap - e.flow) (A aktualizovat hrany o tuto částku) pro (e: = pred [t]; e ≠ null; e: = pred [e.s]) dělat e.flow: = e.flow + df e.rev.flow: = e.rev.flow - df flow: = flow + df dokud pred [t] = null (tj. dokud nebyla nalezena žádná rozšiřující cesta) vrátit se tok
Příklad
Vzhledem k síti sedmi uzlů, zdroj A, jímka G a kapacity, jak je uvedeno níže:
Ve dvojicích napsáno na okrajích, je tok proudu a je kapacita. Zbytková kapacita z na je , celková kapacita, minus již použitý průtok. Pokud síť teče z na je negativní, to přispívá na zbytkovou kapacitu.
Kapacita | Cesta | Výsledná síť |
---|---|---|
![]() | ||
![]() | ||
![]() | ||
![]() |
Všimněte si, jak je délka rozšiřující cesta nalezený algoritmem (červeně) se nikdy nesnižuje. Nalezené cesty jsou nejkratší možné. Nalezený tok se rovná kapacitě napříč minimální řez v grafu oddělujícím zdroj a jímku. V tomto grafu je pouze jeden minimální řez, který rozděluje uzly do sad a , s kapacitou
Poznámky
- ^ Dinic, E. A. (1970). Msgstr "Algoritmus pro řešení problému maximálního toku v síti s odhadem výkonu". Sovětská matematika - Doklady. Doklady. 11: 1277–1280.
- ^ A b Yefim Dinitz (2006). „Dinitzův algoritmus: původní verze a sudá verze“ (PDF). v Oded Goldreich; Arnold L. Rosenberg; Alan L. Selman (eds.). Teoretická informatika: Pokusy o paměť Shimon Even. Springer. 218–240. ISBN 978-3-540-32880-3.
- ^ Edmonds, Jacku; Karp, Richard M. (1972). „Teoretická vylepšení v algoritmické efektivitě pro problémy s tokem sítě“ (PDF). Deník ACM. 19 (2): 248–264. doi:10.1145/321694.321699.
- ^ Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest a Clifford Stein (2009). "26.2". Úvod do algoritmů (třetí vydání). MIT Stiskněte. 727–730. ISBN 978-0-262-03384-8.CS1 maint: více jmen: seznam autorů (odkaz)
Reference
- Algoritmy a složitost (viz strany 63–69). https://web.archive.org/web/20061005083406/http://www.cis.upenn.edu/~wilf/AlgComp3.html