ADS2 Jiří Kalvoda: Cvičení 6
Also available as: PDF Markdown
Informace k cv. jsou na https://kam.mff.cuni.cz/~jirikalvoda/vyuka/25z/ads2.
Toky v sítích
Dinicův algoritmus:
- Začneme s prázdným tokem .
-
Iterativně vylepšujeme tok pomocí zlepšujících toků: (vnější cyklus)
- Sestrojíme síť rezerv: vrcholy a hrany jsou tytéž, kapacity jsou určeny rezervami v původní síti. Dále budeme pracovat s ní.
- Najdeme nejkratší -cestu. Když žádná neexistuje, skončíme.
- Pročistíme síť, tj. ponecháme v ní pouze vrcholy a hrany na nejkratších -cestách.
-
Najdeme v pročištěné síti blokující tok :
- ← prázdný tok
-
Postupně přidáváme -cesty: (vnitřní c.)
- Najdeme st-cestu. Např. hladově – „rovnou za nosem“.
- Pošleme co nejvíce po nalezené cestě.
- Smažeme nasycené hrany.
- Dočistíme síť.
- Zlepšíme podle
Goldbergův algoritmus
Vlna je tok, až na to, že v libovolných vrcholech můžou být kladné přebytky.
- Nastavíme počáteční výšky : Zdroj ve výšce , ostatní .
- Vytvoříme počáteční vlnu: Všechny hrany ze zdroje na maximum, jinde .
-
Dokud existuje vrchol co má kladný přebytek ():
- Pokud existuje hrana s neprázdou rezervou a , převedeme co nejvíce z přebytku po hraně .
- V opačném případě zvedneme o jedna.
Převedení je syté, když použije celou rezervu hrany, jinak je nenasycené a tehdy převede veškerý přebytek.
Úloha 1 (Důkaz): Dokažte následující lemátka (důkaz už zazněl na přednášce, ale měl by jít snadno vymyslet).
- Spád: Kdykoliv je hrana nenasycená, tak , tedy hrana nevede dolů o více než jednu úroveň.
- Korektnost: Pokud algoritmus zastaví, tak je korektní (vrátí tok a navíc ten je maximální).
- Cesta do zdroje: Pokud je ve vrcholu nenulový přebytek, tak existuje v grafu nenasycených hran cesta .
- Výška: Pro každý vrchol .
- Počet zvednutí: Počet zvednutí je .
- Sytá převedení: Sytých převedení je .
- Nenasycená převedení: Nenasycených převedení je . [Potenciál .]
- Časová složitost: Algoritmus doběhne v .
Hinty:
- Indukcí.
- Ukažte, že neexistuje nenasycená cesta, budou se hodit výšky a předešlé lemma.
- Sčítejte přebytky přes množinu vrcholů
- Co by se stalo, kdybychom zvedali vrchol ve výšce .
- Bude se hodit 4.
- Spočítejte to pro každou hranu zvlášť.
- O kolik nejvýše zvedne potenciál syté převedení a zvednutí vrcholu? O kolik minimálně nenasycené převedení sníží potenciál.
- Stačí použít předešlé lemátka.
Úloha 2 (Implementace): Navrhněte implementaci Goldbergova algoritmu se zvedáním nejvyššího vrcholu s přebytkem. Počet nenasycených převedení v takovém případě je (důkaz lze najít v Průvodci). Naším cílem je implementace o stejné složitosti.
Úloha 3 (Jednotkové kapacity): Rozeberte chování Goldbergova algoritmu na sítích s jednotkovými kapacitami. Bude rychlejší než ostatní algoritmy? Nebo alespoň stejně rychlý?
Úloha 4 (Výška zdroje): Co by se stalo, kdybychom v inicializaci Golbergova algoritmu umístili zdroj do výšky , , nebo dokonce ? Rozmyslete si, která vlastnost (skončí, vydá maximální tok, …) na výšce zdroje závisí a mohla by se tím pokazit.
Úloha 5 (Pokrytí): Množinu vrcholů takovou, že každá hrana sousedí alespoň s jedním vrcholem z množiny, nazvěme . Navrhněte algoritmus pro nalezení nejmenšího vrcholového pokrytí v bipartitním grafu. Z toho odvoďte vztah pro velikosti nejmenšího vrcholového pokrytí a největšího párování v bipartitních grafech