Dinicův algoritmus
Dinicův algoritmus je algoritmus vyvinutý Jefimem Dinicem (1970) pro výpočet maximálního toku v síti. Hlavní myšlenka algoritmu spočívá v iterativním výpočtu tzv. "blokujících" toků, které se postupně nasčítají až na tok maximální. Tento přístup dovoluje v průměrném případě počítat maximální tok rychleji než Fordovým–Fulkersonovým algoritmem, který pro výpočet využívá hledání zlepšujících cest.
Algoritmus
- vyrobím síť rezerv
- projdu graf z s (zdroje) do šířky a zjistím délku d nejkratší cesty do t (stoku)
- vyhodím
- hrany začínající a končící ve stejné vrstvě nebo hrany nazpátek (ty nepoužijeme—nejkratší cesta jimi jít nemůže)
- a také vrcholy, které tvoří "slepé uličky" (nevede z nich žádná dopředná hrana)
- a hrany do těchto vrcholů (cyklicky—odstraněním konce slepé uličky může vzniknout nový konec)
- výsledek kroku 3 nazvu "čistá síť"
- najdu cestu z s do t délky d
- zjistím minimum m z rezerv na této cestě, zvýším o m tok podél celé cesty, čímž do sítě rezerv přibudou zpětné hrany s rezervou m, a u jedné hrany v cestě zmizí dopředná hrana
- vyčistím síť, a pokud zbude nějaká cesta z s do t délky d, jdu na krok 5
- vezmu celou síť a jdu na 2 (nejkratší cesta bude mít délku d+1, ty kratší už v síti rezerv nejsou)
- pokud už neexistuje cesta z s do t, skončil jsem (můžu najít i hrany minimálního řezu—jejich počáteční vrcholy jsou konci slepých uliček)
Příklad
Následující příklad ilustruje průběh Dinicova algoritmu. představuje aktuální stav grafu, síť rezerv a nalezený blokující tok. Červené hodnoty ve vrcholem reprezentují vzdálenost bodů od zdroje (), v ostatních grafech očíslování vrcholů.
1. | |||
---|---|---|---|
Nejkratší cesta ze zdroje do stoku má délku 3, blokojící tok sestává z následujících zlepšujících cest cest:
Celkově má blokující tok velikost 14 jednotek. | |||
2. | |||
Do připočteme blokující tok nalezený v předchozí iteraci. Do přidáme "protisměrné" hrany reprezentující rezervy hran v protisměru. Opět nalezneme všechny nejkratší zlepšující cesty (v tomto případě cesty délky 4) a "hladově" nalezneme blokující tok. Ten bude obsahovat pouze následující cestu:
K celému toku připočteme blokující tj. is 14 + 5 = 19. | |||
3. | |||
Blokující tok opět připočteme do původního grafu a upravíme i hodnoty v grafu rezerv (). V tuto chvíli již neexistuje žádná cesta ze zdroje do stoku (), tedy algoritmus vrátí maximální tok = 19. | |||
Složitost algoritmu
Asymptotická časová složitost algoritmu je , kde n označuje počet vrcholů a m počet hran zpracovávaného grafu. Pokud chceme vyjádřit složitost pouze v závislosti na n, je tato , neboť hran grafu je řádově nejvýše .
Algoritmus lze rozdělit na fáze, kde jednou fází se rozumí jedna posloupnost kroků 2–7. O fázích platí:
- každá fáze probíhá s asymptotickou časovou složitostí
- v každé fázi hledáme cesty ze zdroje do spotřebiče délky d, což je délka nejkratší nezpracované cesty v grafu; d je alespoň o 1 větší než d předchozí fáze
- fází proběhne nejvýše n
Algoritmus se dá modifikovat takzvanou metodou tří Indů: místo hledání cesty se pro každý vrchol spočítá, jaké mají rezervy vstupní hrany a výstupní hrany jednotlivých vrcholů a vrcholem s nejmenším minimem těchto hodnot se tok zvýší. Tím se asymptotická složitost zlepší na .
S použitím datových struktur (dynamické stromy) je možno nalézt blokující tok ve vrstevnaté síti v čase , čímž dostáváme složitost celého algoritmu .
Související články
Reference
- Jakub Černý: Základní grafové algoritmy (texty v pdf)
- Martin Mareš, Tomáš Valla: Průvodce labyrintem algoritmů (text v pdf)