The Postal Owl

Logged in: Santa Claus (home)   

Algoritmy a datové struktury 2

Back to the course

2. Série domácích úkolů

Deadline: 2022-11-10 14:00 (56 days ago)

Pavel Turinský — 2022-10-27 18:34 (69 days ago) — reply

Attachment (pdf)

Tomáš Domes — 2022-11-04 19:11 (61 days ago) — reply

Nápovědy:
- V příkladu 2 nám jde o důkaz (ne)existence nějakých posloupností zlepšujících cest. Není tedy nutné najít způsob jak posloupnost vytvořit.
- Příklad 3 je velmi podobný příkladu ze 4. cvičení kde jsme dokazovali stejnou složitost pro jednotkové kapacity. Správné řešení lze dobře formulovat s využitím amortizace.
- Příklad 4 je pouze další příklad na využití toků, podobný jako hledání největšího párování v bipartitním grafu.

Tomáš Domes — 2022-11-04 20:12 (61 days ago) — reply

Za doplňující otázku ohledně podmínek existence řešení ve 4. příkladu nestrhávám žádné body. Pokud ale někdo dodá jednoznačnou charakterizaci existence řešení (tedy nutnou a zároveň postačující podmínku) včetně důkazu, dostane 5 bonusových bodů.

Tomáš Domes — modified 2022-11-04 20:13 (61 days ago) — reply

Pokud byste se někdo náhodou chtěli někdy naučit kreslit obrázky k matematickým úlohám v počítači, doporučuji program IPE: <https://ipe.otfried.org/>

Tomáš Domes — 2022-11-07 23:26 (58 days ago) — reply

Upřesnění zadání úlohy 2: Zadání nespecifikuje, zda po cestě navržené orákulem musíme poslat maximální možný tok, nebo ne. Pro plný počet bodů bude stačit vyřešit jednodušší variantu, ve které nám orákulum poradí nejen cestu, ale i kolik toku po ní máme poslat. Řešení, které předpokládá, že po cestě navržené orákulem musíme vždy poslat maximální možný tok, získá bonusové body.

Santa Claus — 2022-11-10 01:22 (56 days ago) — editreply

1. Protipříklad: viz obrázek. Nejkrátší zlepšení je v první iteraci cesta délky tři přes "střed" diamantu, ale toto zablokuje jakýkoliv další tok. Maximální tok má ale velikost 2 (po obvodu diamantu).

![diamond](https://webik.ms.mff.cuni.cz/~78002598/diamond.png)

2. 
    a. Ne nutně nejkratší cesta.  
	i) Orákulum poradí i kapacitu.
	
	Každý tok můžeme rozložit dva podtoky: jeden ve tvaru cesty a druhý, který využívá o jednu hranu méně, a sice následovně:
	
	Pro hranu s nejmenším průtokem nalezneme na toku cestu ze zdroje do stoku, na kterém hrana leží. (Nalezneme cestu do počátku hrany ze zdroje a pak také z konce hrany do stoku).
	
	Původní tok můžeme rozdělit podtok, který je tato cesta s velikostí toku rovnému původní velikosti toku na dané hraně - to můžeme udělat, protože původní hrana měla nejmenší průtok, průtoky ostatních hran tedy nebudou vyšší než jejich průtoky v původním toku, tudíž nepřekročí kapacitu. Druhý tok vznikne odečtením průtoků na prvním podtoku od původního toku. Žádná hrana nebude mít záporný průtok - odečetli jsme nejvýše minimum průtoků. Kirchhoffovy zákonu zůstanou evidentně zachovány.
	
	Takto můžeme tok na konečném počtu hran rozložit na konečný počet podtoků ve tvaru cest a nulový tok. (Induktivně, pokud není tok ve tvaru cesty, ubereme hranu, má konečný počet hran, takže dříve nebo později se zastavíme (nejpozději když zbyde jediná hrana - přímo ze zdroje do stoku))
	
	Toto nám poskytuje jednotlivé instrukce orákula 
	
	ii) Vždy pošleme plnou kapacitu
	
	TBD
	
    b. Nejkratší cesta
	
	Neplatí, pro protipříklad viz stejný obrázek jako u 1. Orákulum poradí cestu, která nám síť ihned zablokuje.

3. 

Hrany s celočíselnou kapacitou omezenou konstantou lze rozdělit na multihrany s jednotkovou kapacitou. Každou hranu rozdělíme maximálně na konstantně nových hran, celkový počet hran tedy bude stále $O(m)$.

Pak máme multigraf s jednotkovými hranami. Hledání toku na multigrafu je stejné jako na jednoduchém grafu.  
Navíc na grafu s jednotkovými hranami rychleji nalezneme blokující tok, použijeme úpravu na toky s jednotkovými kapacitami (z přednášky/poznámek [M. Mareše]):

> Pokud síť neobsahuje cykly délky 2 (dvojice navzájem opačných hran), všechny rezervy jsou jen 0 nebo 1. Pokud obsahuje, mohou rezervy být i dvojky, a proto síť upravíme tak, že ke každé hraně přidáme hranu opačnou s nulovou
kapacitou a rezervu proti směru toku přiřkneme jí.

(Maximálně jich ale přidáme m.) 

> Při hledání blokujícího toku tedy budou mít všechny hrany na nalezené cestě stejnou, totiž jednotkovou, rezervu, takže vždy z grafu odstraníme celou cestu.
Když máme m hran, počet zlepšení po cestách délky l bude maximálně m/l. Proto
složitost hledání blokujícího toku bude $m/l · O(l) = O(m)$.Tedy pro jednotkové
kapacity dostáváme složitost O(nm).


4. Vytvoříme následující graf:

![poslanci](https://webik.ms.mff.cuni.cz/~78002598/poslanci.png)  

Začneme vytvořením zdroje. Poslanci budou reprezentováni vrcholy. Do každého z nich hrana ze zdroje o kapacitě jedna. Kluby budou reprezentovány vrcholy. Do každého klubu povede hrana s kapacitou 1 z poslance, pokud je poslanec členem. Ze všech klubů povedou hrany s kapacitou dva do spotřebiče.

Úlohu pak lze převést na hledání toku, který využije kapacity hran vedoucích do stoku naplno. Stačí tedy nalézt maximální tok, žádný maximální tok nebude větší (řez podle všech hran vedoucích do stoku). 

Správnost je patrná z konstrukce: žádný poslanec nebude kumulovat funkce: může z něj vést maximálně jedna využítá hrana. Jak víme, algoritmus zachová celočíselné ohodnocení. Pokud budou všechny hrany do stoku naplněny, do každého klubu vedou právě dvě naplněné hrany.

Podmínkou existence řešení je existence takového toku, pokud neexistuje, existuje minimální řez s menší kapacitou přes hrany mezi poslanci a kluby (případně i poslanci a zdrojem). Pokud takový tok existuje, máme řešení.

Tomáš Domes — 2022-11-19 17:56 (46 days ago) — reply

1. Ok, 5b

Points: 5.00

Tomáš Domes — 2022-11-19 21:25 (46 days ago) — reply

2. Hezké, 6b

Points: 11.00

Tomáš Domes — 2022-11-21 22:19 (44 days ago) — reply

3. Tady jsi bohužel řešil trochu jiný problém, než jaký byl zadaný. Cílem bylo dokázat že běžný Dinicův algoritmus na zadané síti běží rychle, nikoliv že umíme síť či algoritmus nějak upravit, abychom dosáhli složitosti $O(mn)$. Tvé řešení by šlo zachránit, pokud bys dále dokázal, že Dinic na původním grafu se ve skutečnosti bude chovat stejně jako ten na tom upraveném. 

To dokázat, jde, pro každou cestu kterou najde normální Dinic na původním grafu a pošle po ní tok $t$ můžeme v tom našem vybrat $t$ krát za sebou tu stejnou cestu pokaždé s jinou multihranou a dojdeme k blokujícímu toku vždy ve stejné chvíli a zároveň půjde o korektní záznam postupu Dinicova algoritmu.

Tím že jsi řešil jiný problém, nemůžu ti dát plný počet, ale protože se dá celkem jednoduše upravit na správné řešení, dám ti 3b.

Points: 14.00

Tomáš Domes — 2022-11-27 14:31 (39 days ago) — reply

4. To je správně, jenom pozor, že jsi zapomněl dokázat opačnou implikaci, tedy že pokud nenajdeme tok správné velikosti, tak určitě neexistuje řešení. Taky jsi nějak nezmínil jak z toho toku dostanu řešení naší původní úlohy, ale z tvého důkazu správnosti je vidět že to víš, tak ti to uznám. Takže 4.5 b

Points: 18.50

New post (You can use Markdown with KaTeX math here)

Preview: