Domovská stránka Jiřího Kalvody

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:

  1. Začneme s prázdným tokem ff.
  2. Iterativně vylepšujeme tok pomocí zlepšujících toků: (vnější cyklus)
    1. 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í.
    2. Najdeme nejkratší stst-cestu. Když žádná neexistuje, skončíme.
    3. Pročistíme síť, tj. ponecháme v ní pouze vrcholy a hrany na nejkratších stst-cestách.
    4. Najdeme v pročištěné síti blokující tok fBf_B:
      1. fBf_B ← prázdný tok
      2. Postupně přidáváme stst-cesty: (vnitřní c.) O(mn)\O(mn)
        1. Najdeme st-cestu. Např. hladově – „rovnou za nosem“.
        2. Pošleme co nejvíce po nalezené cestě.
        3. Smažeme nasycené hrany.
        4. Dočistíme síť.
    5. Zlepšíme ff podle fBf_B

Goldbergův algoritmus

Vlna je tok, až na to, že v libovolných vrcholech můžou být kladné přebytky.

  1. Nastavíme počáteční výšky h(v)h(v): Zdroj ve výšce nn, ostatní 00.
  2. Vytvoříme počáteční vlnu: Všechny hrany ze zdroje na maximum, jinde 00.
  3. Dokud existuje vrchol us,tu \not= s, t co má kladný přebytek (fΔ>0f^{\Delta} > 0):
    1. Pokud existuje hrana uvuv s neprázdou rezervou r(uv)>0r(uv) > 0 a h(u)>h(v)h(u) > h(v), převedeme co nejvíce z přebytku po hraně uvuv.
    2. V opačném případě zvedneme uu 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).

  1. Spád: Kdykoliv je hrana uvuv nenasycená, tak h(u)h(v)1h(u)-h(v) \le 1, tedy hrana nevede dolů o více než jednu úroveň.
  2. Korektnost: Pokud algoritmus zastaví, tak je korektní (vrátí tok a navíc ten je maximální).
  3. Cesta do zdroje: Pokud je ve vrcholu vv nenulový přebytek, tak existuje v grafu nenasycených hran cesta vsv \rightarrow s.
  4. Výška: Pro každý vrchol h(v)2nh(v) \leq 2n.
  5. Počet zvednutí: Počet zvednutí je 2n2\le 2n^2.
  6. Sytá převedení: Sytých převedení je nm\le nm.
  7. Nenasycená převedení: Nenasycených převedení je O(n2m)\O(n^2m). [Potenciál vs,t,s nenulovyˊm prˇebytkemh(v)\sum_{v\neq s,t, \hbox{s nenulovým přebytkem}} h(v).]
  8. Časová složitost: Algoritmus doběhne v O(n2m)\O(n^2m).

Hinty:

  1. Indukcí.
  2. Ukažte, že neexistuje nenasycená cesta, budou se hodit výšky a předešlé lemma.
  3. Sčítejte přebytky přes množinu vrcholů
  4. Co by se stalo, kdybychom zvedali vrchol ve výšce 2n2n.
  5. Bude se hodit 4.
  6. Spočítejte to pro každou hranu zvlášť.
  7. O kolik nejvýše zvedne potenciál syté převedení a zvednutí vrcholu? O kolik minimálně nenasycené převedení sníží potenciál.
  8. 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 O(n2m)\O(n^2 \sqrt{m}) (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 n1n-1, n2n-2, nebo dokonce n3n-3? 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