TGH10 - Maximální toky Jan Březina Technical University of Liberec 23. dubna 2013
- motivace Elektrická sít : Elektrická sít, jednotlivé vodiče mají různou kapacitu (max. proud). Jaký maximální proud může téci z místa A do místa B. Počítačová sít : Jednotlivé switche jsou propojeny linkami s různou reálnou propustností. Kolik bajtů za sekundu můžeme maximálně protlačit ze switche A do switche B? Optimalizace letů: Mezi městy létají letadla s různou kapacitou, kolik lidí jsem schopen maximálně přepravit z města A do města B? Sít je uspořádaná čtveřice G = ((V, E), c, s, t), kde (V, E) je orientovaný graf, c : V V R + jsou kapacity hran (c(u, v) = 0 pokud (u, v) / E), s V je vstupní a t V je výstupní vrchol.
Grafová úloha Tok sítí je zobrazení f : V V R splňující: 1. omezenost toku kapacitou, f(u, v) c(u, v) 2. bilance hran(antisymetrie) f(u, v) = f(v, u) (kvůli zápisu bilance vrcholů) 3. bilance vrcholů f(v, u) = 0, v V Velikost toku je celkový výtok ze vstupního uzlu: f = v V f(s, v) pro u s, t Úloha: Najdi tok sítí s maximální velikostí.
Tok sítí - zápis (a) Sít, t.j. graf s kapacitami hran. (b) Tok sítí, zapisujeme pouze kladné hranové toky spolu s kapacitami hrany: tok/kapacita.
Multi source/sink flow network Poznámka: Pokud by vstupních a výstupních vrcholů bylo více (obr. a), přidáme jeden super vstupní a jeden super výstupní vrchol a připojíme je hranami s nekonečnou kapacitou (obr. b).
Reziduální graf toku f Reziduální kapacita hrany c f je kapacita snížená o tok (zůstává kladná) c f (u, v) = c(u, v) f(u, v) Residuální graf/sít G f = (V, E f ) tvoří hrany s kladnou residuální kapacitou: E f = {(u, v) c f (u, v) > 0}
obecná Ford-Fulkerson metoda Schéma algoritmu: inicializuj f(u, v) = 0; while dokud existuje zlepšující cesta p do zvyš tok f podél cesty p Zlepšující cesta je cesta z s do t v residuálním grafu.
Jeden krok Ford-Fulkersona (a) tok sítí (b) residuální graf a zlepšující cesta (c) tok po aplikaci zlepšující cesty (d) nový residuální graf, neexistuje cesta
Řezy Množina vrcholů S V definuje řez δ(s): množina orientovaných hran z S do doplňku S = V \ S. Budeme uvažovat pouze tzv. (s, t)-řezy, kde zdroj s je ve zdrojové části řezu, s S, a stoka t je v cílové části řezu t S. Tok řezem f(s, T ) je součet toků přes hrany řezu: f(s) = f(s, S ) = f(u, v) u S v S sčítáme přes všechny hrany řezu. Díky pravidlu o bilanci hran zároveň odčítáme toky z S do S. kapacita řezu c(s): c(s) = c(s, S ) = c(u, v) u S v S
Lemma Pro tok f sítí G je tok libovolným řezem δ(s) roven velikosti toku f. Důkaz. Rovnosti mezi řádky: f(s, S ) = f(s, V \ S) = = f(s, V ) f(s, S) = = f(s, V ) = f ( {s} (S \ {s}), V ) = = f(s, V ) + f(s \ s, V ) = = f(s, V ) = f 1. Tok f(s, V ) je součet toků všech hran z S, v f(s, S ) jsou jen hrany z S do S, odečteme tedy součet přes hrany z S do S. 2. Tok f(s, S) je díky bilanci hran nulvý. 3. Podobná úvaha jako v 1). 4. f(s \ s, V ) je součet všech hran odchozích z S \ s, díky bilanci na vrcholech je součet nulový. Důsledek: Velikost každého toku je menší/rovna kapacitě každého řezu.
Věta o maximálním toku a minimálním řezu. Theorem Necht f je tok v síti (V, E, c, s, t), pak následující je ekvivalentní: 1. f je maximální tok 2. reziduální graf G f neobsahuje zlepšující cestu z s do t 3. f = c(s, S ) pro nějaký řez δ(s) Důkaz: 1 2: Pokud by existovala zlepšující cesta nebyl by tok maximální, můžeme jí použít ke zvětšení toku. 2 3: S = množina vrcholů, do kterých vede zlepšující cesta v residuálním grafu G f. Pro všechny hrany uv δ(s) je f(u, v) = c(u, v) jinak by i v pařilo do S. Proto f = f(s, S ) = c(s, S ). 3 1: Z Důsledku máme f (S, S ) c(s, S ) = f(s, S ) pro libovolný jiný tok f.
Edmons-Karp verze Ford-Fulkersona 1. nastav tok f na nulu (na všech hranách) 2. pro f vytvoř reziduální graf G f 3. proved BFS na G f ze zdroje s 4. dopředné hrany tvoří čistou sít G f 5. pokud BFS nenalezne cestu do t algoritmus končí 6. jako vylepšující cestu p vezmeme nejkratší cestu z s do t na G f (nalezenou pomocí BFS) 7. vypočteme kapacitu zlepšující cesty c f (p) = min{c f (e) e p} 8. tok všemi hranami v cestě p zvětšíme o kapacitu cesty: for (u, v) p do f(u, v) = f(u, v) + c f (p); f(v, u) = f(u, v); 9. pokračujeme bodem 2)
Jak to funguje? Z reziduálního grafu G f odmazáváme hrany které se nasytily a zvyšujeme kapacitu na opačných hranách. Dokud je délka nejkratší cesty stejná, pouze umazáváme hrany v čisté síti G f. Těchto umazání je max. E. Vzdálenost d(s, v) na grafu G f (jedničkové ohodnocení) v průběhu algoritmu neklesá. Tedy neklesá ani d(s, t). Celkem existuje max. V různých délek zlepšujících cest. Maximálně tedy použijeme V E zlepšujících cest. Nalezení a aplikace zlepšující cesty má složitost O(V + E) Celková složitost O(V E 2 )
Dinicův algoritmus blokující tok v čisté síti G f je čistá sít G f je DAG najdeme maximální tok čistou sítí, tzv. blokující tok algoritmus: 1. nastav nulové toky 2. najdi G f a pak G f pomocí BFS 3. opakovaně prováděj DFS na G f pro nalezení zlepšujících cest v čase O(n) 4. opakuj 2) DFS v bodě 3) proběhne max. E krát až se nasytí všechny hrany čisté sítě Při rekurzivní implementaci DFS můžeme při návratu z rekurze provádět update toku. Složitost: O(V 2 E)
Metoda tří Indů Blokující tok lze také počítat pomocí kapacit čisté sítě ve vrcholech v čase O(V 2 ). Celkový algoritmus se zlepší na O(V 3 ).