Edmonds-Karpův algoritmus

Algoritmus Edmonds-Karp řeší problém nalezení maximálního toku v transportní síti . Algoritmus je speciálním případem Ford-Fulkersonovy metody a běží v čase v grafu . Poprvé ji publikoval v roce 1970 sovětský vědec E. A. Dinitz . Později, v roce 1972, byl nezávisle objeven Edmondsem a Karpem .

Algoritmus

Algoritmus Edmonds-Karp je variantou algoritmu Ford-Fulkerson, ve kterém se v každém kroku volí nejkratší komplementární cesta z do ve zbytkové síti (za předpokladu, že každá hrana má jednotkovou délku). Nejkratší cesta se najde hledáním do šířky .

Popis

  1. Obnovili jsme všechny streamy. Zbytková síť se zpočátku shoduje s původní sítí.
  2. Ve zbytkové síti najdeme nejkratší cestu od zdroje k jímce. Pokud taková cesta není, zastavíme se.
  3. Necháme přes nalezenou cestu (říká se tomu rostoucí cesta nebo rostoucí řetězec ) maximální možný tok:
    1. Na nalezené cestě ve zbytkové síti hledáme hranu s minimální kapacitou .
    2. Pro každou hranu na nalezené cestě průtok zvýšíme o , v opačném směru snížíme o .
    3. Upravujeme zbytkovou síť. Pro všechny hrany na nalezené cestě i pro hrany k nim protilehlé vypočítáme novou kapacitu. Pokud bude nenulová, přidáme do zbytkové sítě hranu, a pokud bude nulová, vymažeme ji.
  4. Vrátíme se ke kroku 2.

K nalezení nejkratší cesty v grafu používáme vyhledávání na šířku :

  1. Vytvoříme frontu vrcholů O. Zpočátku , O sestává z jediného vrcholu s .
  2. Vrchol s označíme jako navštívený, bez rodiče a všechny ostatní jako nenavštívené.
  3. Dokud fronta není prázdná, proveďte následující kroky:
    1. Smažte první vrchol ve frontě u .
    2. Pro všechny oblouky ( u , v ) vycházející z vrcholu u , pro které vrchol v ještě nebyl navštíven, proveďte následující kroky:
      1. Vrchol v označíme jako navštívený s nadřazeným u .
      2. Přidejte vrchol v na konec fronty.
      3. Pokud v = t , opusťte obě smyčky: našli jsme nejkratší cestu.
  4. Pokud je fronta prázdná, vrátíme odpověď, že cesta vůbec nevede a zastavíme.
  5. Pokud ne, přejdeme z t do s , pokaždé přejdeme k rodiči. Cestu vracíme v obráceném pořadí.

Obtížnost

V průběhu práce Edmonds-Karpův algoritmus najde každou komplementární cestu v čase . Níže ukážeme, že celkový počet zvýšení průtoku provedených tímto algoritmem je . Složitost Edmonds-Karpova algoritmu je tedy .

Důkaz

Nazvěme vzdálenost od vrcholu x k vrcholu y délkou nejkratší cesty z x do y ve zbytkové síti, měřenou počtem hran. Pokud taková cesta neexistuje, budeme vzdálenost považovat za nekonečnou. Řekneme, že y se přiblížilo x (odchýlilo se od x ), pokud se vzdálenost od x k y zmenšila (zvětšila). Řekneme, že y je blíže k x (dále od x ) než z , pokud je vzdálenost x k y menší (větší) než vzdálenost x k z .

Lemma . V průběhu algoritmu se žádný vrchol nikdy nepřiblíží ke zdroji. Důkaz . Ať tomu tak není, pak se s určitým zvýšením průtoku některé vrcholy přiblížily ke zdroji. Nazvěme je špatně. Vybereme jeden ze špatných vrcholů, který se po zvýšení průtoku ukázal být nejblíže zdroji (pokud jich je více, tak kterýkoli). Označte vybraný vrchol v . Uvažujme nejkratší cestu z s do v . Předposlední vrchol na této cestě označte u , takže cesta vypadá jako . Protože u je blíže k s než v a v je nejbližší nelegální vrchol k s , pak u je pravidelný vrchol. Značíme-li vzdálenosti od s do u a v před a po nárůstu toku, respektive jako , , , , máme:

,

kde

Proto před zvýšením průtoku ve zbytkové síti chyběl oblouk ( u , v ). Aby se objevila, musela rozšiřující cesta obsahovat oblouk ( v , u ). Ale v Edmonds-Karpově algoritmu je rozšiřující cesta vždy nejkratší, takže

,

což odporuje předchozí nerovnosti. Náš předpoklad byl tedy mylný. Lema je dokázáno.

Nazvěme kritické , že okraje augmentační cesty, jejichž zbytková kapacita je minimální. Odhadněme, kolikrát může být některá hrana (u, v) kritická. Ať se to stane při iteraci a příště při iteraci . Označením vzdálenosti od s do y v iteraci t máme:

Všimněte si, že při iteraci kritická hrana zmizí ze zbytkové sítě. Aby se v něm hrana (u, v) do doby iterace znovu objevila, je nutné, aby při nějaké mezi iteraci byla zvolena rozšiřující cesta obsahující hranu (v, u). Tudíž,

Pomocí dříve osvědčeného lemmatu dostaneme:

Protože zpočátku (jinak v = s, ale hrana vedoucí k s se nemůže objevit na nejkratší cestě od s do t) a vždy, když je samozřejmě menší než |V| (nejkratší cesta neobsahuje cykly, a proto obsahuje méně |V| hran), hrana může být ve většině případů kritická. Protože každá rozšiřující cesta obsahuje alespoň jednu kritickou hranu a celkový počet hran, které se jednoho dne mohou stát kritickými (všechny hrany původní sítě a jejich protilehlé), pak můžeme cestu zvětšit maximálně |E|·|V | jednou. Počet iterací tedy nepřesahuje O(|E|·|V|), což bylo třeba dokázat.

Příklad

Nechť je dána síť se zdrojem ve vrcholu a mozkem ve vrcholu . Na obrázku dvojice označuje tok podél této hrany a její průchodnost.

Šířka první hledání

Popišme v prvním kroku prohledávání do šířky.

  1. Fronta se skládá z jednoho vrcholu A. Byl navštíven vrchol A. Neexistuje žádný rodič.
  2. Fronta se skládá (od začátku do konce) z vrcholů B a D. Navštíví se vrcholy A, B, D. Vrcholy B, D mají rodiče A.
  3. Fronta se skládá z vrcholů D a C. Navštíveno A, B, C, D. Vrcholy B, D mají nadřazený A, vrchol C má nadřazený B.
  4. Fronta se skládá z vrcholů C, E, F. Navštívené A, B, C, D, E, F. Vrcholy B, D mají rodiče A, vrchol C má rodič B, vrcholy E, F mají rodiče D.
  5. Vertex C je odstraněn z fronty: jeho okraje vedou pouze k již navštíveným vrcholům.
  6. Je nalezena hrana (E,G) a smyčka se zastaví. Vrcholy (F,G) jsou ve frontě. Všechny navštívené vrcholy. Vrcholy B, D mají rodiče A, vrchol C má rodič B, vrcholy E, F mají rodiče D a vrchol G má rodič E.
  7. Jdeme podle rodičů: . Prošlou cestu vracíme v obráceném pořadí: .

Všimněte si, že vrcholy dosažitelné z A přesně v 1 kroku, přesně ve 2 krocích a přesně ve 3 krocích byly postupně přidány do fronty. Kromě toho je rodičem každého vrcholu vrchol dosažitelný z A přesně o 1 krok rychleji.

Základní algoritmus

Kapacita cesty Cesta












Všimněte si, že během provádění algoritmu se délky komplementárních cest (na obrázcích označeny červeně) nezmenšují. Tato vlastnost je splněna díky tomu, že hledáme nejkratší doplňkovou cestu .

Dinitzův algoritmus

Vylepšená verze Edmonds-Karpova algoritmu je Dinitzův algoritmus, který vyžaduje operace.

Pomocnou bezobrysovou síť grafu G se zdrojem s nazveme jejím podgrafem obsahujícím pouze ty hrany (u, v), pro které je minimální vzdálenost od s k v o jednu větší než minimální vzdálenost od s k u.

Dinitův algoritmus:

  1. Sestrojíme minimální bezkonturovou síť zbytkového grafu.
  2. Pokud je v síti cesta od s do t, proveďte následující kroky:
    1. Najděte nejkratší cestu z s do t. Pokud neexistuje, opusťte smyčku.
    2. Na nalezené cestě ve zbytkové síti hledáme hranu s minimální kapacitou .
    3. Pro každou hranu na nalezené cestě průtok zvýšíme o , v opačném směru snížíme o .
    4. Vymažeme všechny hrany, které dosáhly saturace.
    5. Vymažeme všechny slepé uličky (tedy vrcholy, kromě propadu, ze kterého nejdou žádné hrany, a vrcholy kromě zdroje, kam žádné hrany nevstupují), spolu se všemi hranami, které k nim patří.
    6. Opakujte předchozí krok, dokud je co odstranit.
  3. Pokud je nalezený proud nenulový, přidejte jej k celkovému proudu a vraťte se ke kroku 1.

Odkazy

Literatura