Warning
This page is located in archive.

Nováček


Rozvrh denně přibližně dopoledne 9.00 - 11.45, odpoledne 12.30 - 14.30, 14.45 - 16.00.
. Úpravy možné po dohodě s lektorem.

Učebna: E-132 Budova E v areálu FEL ČVUT na Karlově náměstí.

  ____________________________________________________________________________________________

Pondělí 12.9. dopoledne i odpoledne

Vedou Dan Hubáček, Michal Kučera (dopol), Jan Blaha (odpol)
Na praktikách asistují Dan Hubáček, Michal Kučera(dopol), Jan Blaha(odpol), Adéla Atassi

.

Seznámení s grafovými úlohami

Slidy: Úvodní grafový přehled ( pdf).

Vzorová úloha Lokální zpracování a prohledávání grafu, bezprostřední okolí vrcholů grafu, typická úloha: počet trojúhelníků.

Graf na vstupu – Formát dat Data Graf
První řádek vstupu obsahuje dvě celá kladná čísla N a M oddělená mezerou představující po řadě počet uzlů a počet hran grafu. Předpokládáme, že uzly grafu jsou číslovány 0, 1, 2, …, N−1.
Následuje M řádků, každý popisuje jednu hranu. Pokud graf není vážený, jsou na řádku dvě celá čísla oddělená mezerou – čísla krajních uzlů hrany. Pokud je graf vážený, jsou na řádku tři celá čísla oddělená mezerou – čísla krajních uzlů hrany a váha hrany.
Pořadí uzlů na řádku i pořadí hran na vstupu může být libovolné.
7 13
4 0
5 0
0 6
3 4
4 2
4 6
3 5
6 3
1 6
4 1
5 6
1 5
0 3

Úloha 1.

Načtěte nevážený graf ze souboru a vypište k každému uzlu jeho seznam hran. Stáhněte si data s obrázky.

Úloha 2.

Načtěte vážený graf ze souboru a vypište k každému uzlu jeho seznam hran. Stáhněte si data s obrázky.

Úloha 3.

V daném grafu zjistěte pro každý možný stupeň uzlu D, kolik je takových hran, jejichž oba koncové uzly mají tento stupeň D. Pro každý stupeň tento počet hran vypište. Porovnejte své výsledky s ukázkovými. Stáhněte si data s obrázky.

Úloha 4.

Jindra vyrazí z uzlu A, který má určitý stupeň D. Pak jde do některého jeho sousedního uzlu B a nezajímá se o stupeň uzlu B. Z uzlu B se přesune do uzlu C, který je sousedem B a není to A. Jindra trvá na tom, že stupeň D startovního uzlu A i stupeň cílového uzlu C musejí být stejné. Určete, kolik je v daném grafu možností procházek podle Jindrových pravidel. Vypište toto jediné číslo na výstup. Stáhněte si data s obrázky.

Úloha 5.

Řekneme, že hrana H je lokálně minimální, pokud její váha je striktně menší než váha kterékoli hrany, která s H sdíli jeden uzel. Najděte v daném váženém grafu všechny lokálně minimální hrany a vypište je v rostoucím lexikografickém pořadí jejich krajních uzlů. Stáhněte si data s obrázky.

Úloha 6.

Určete, kolik je trojúhelníků v každém grafu úlohy 4. Trojúhelník je trojice uzlů, v níž každý uzel sousedí se zbylými dvěma uzly.

vzorová implementace

Úloha 7.

Určete, kolik je kružnic délky 4 v každém grafu úlohy 4. Kružnice nesmí obsahovat příčku, tj. první a třetí uzel v kružnici nesmí spolu sousedit a druhý a čtvrtý uzel v kružnici spolu nesmí sousedit.

Další úložky:

K těmto úložkám se lze vracet i později a slouží jako záchytný bod pro ty, kdo už vše zvládli nebo znají z dřívějška apod. Pokaždé je vhodné si úlohu maximálně rozmyslet bez klávesnice a formulovat abstraktně (v grafu daném tak a tak hledáme to či onou pomocí určité metody). Konzultace vlastních nápadů s kolegy (lektory) je doporučena.

  ____________________________________________________________________________________________

Úterý 13.9. dopoledne

Vedou Jan Blaha, Michal Kučera
Na praktikách asistují DJan Blaha, Michal Kučera, Adéla Atassi
.

BFS a DFS (= Breadth-First Search a Depth-First Search), fronta a zásobník, BFS a vzdálenosti v grafu.

Slidy: Prohledávání grafu

  1. Stáhněte soubor s daty, se kterými budete pracovat.
  2. Nalezněte výchozí implementaci zásobníku ve vašem oblíbeném jazyce. Poté načtěte soubor seq.txt. Na každém řádku máte jeden z příkazů insert <number> a remove. Příkaz insert <number> vloží číslo <number> do zásobníku. Příkaz remove odstraní prvek ze zásobníku a vypíše ho na standardní výstup.
  3. [Dobrovolné] Sami naimplementujte zásobník a zopakujte úkoly z bodu 2. s vaší implementací. Zkontrolujte, že se výsledky shodují.
  4. To samé jako 2., pouze použijte frontu.
  5. [Dobrovolné] To samé jako 3., pouze implementujte frontu.
  6. Načtěte graf graph.txt jako neorientovaný graf. Ten je definovaný ve stejném formátu jako včera.
  7. Určete jaké vrcholy lze navštívit z vrcholu 0. Kolik jich je?
  8. Jaká je délka nejkratší cesty z vrcholu 0 do vrcholu 7.
  9. Kolik je komponent souvislosti v grafu? Komponenta souvislosti je množina vrcholů, že mezi každou dvojicí z nich vede cesta. Přitom platí, že do komponenty souvislosti již nelze přidat žádný další vrchol grafu tak, aby tato vlastnost zůstala zachována. Více detailů zde a zde.
  10. Nyní načtěte graf graph.txt jako orientovaný graf.
  11. Zopakujte úkoly 7. a 8. (abychom zvládli 9. pro orientovaný graf, museli bychom umět buď Tarjanův algoritmus nebo Kosarajiho algoritmus)
  ____________________________________________________________________________________________

Úterý 13.9. odpoledne

Vedou Dan Hubáček, Jan Blaha
Na praktikách asistují Dan Hubáček, Jan Blaha, Adéla Atassi
.

Prioritní fronta, halda.

Slidy: Prioritní fronta, halda

Poučení:

Úkoly:

  1. Zopakujte úkol 2. z rána, pouze místo zásobníku použijte haldu. Operaci remove chápejte jako extract-min.
  2. Zopakujte předchozí úkol, ale místo haldy použijte pole. Prvky přidávejte nakonec a při implementaci extract-min hledejte minimum naivně pomocí procházení celého pole.
  3. Porovnejte časy běhu z kroků 1. a 2.
  4. Naimplementujte Median Maintenance, o kterém jsme mluvili na přednášce. Jako vstup můžete použít čísla ze souboru seq.txt, operace remove ignorujte.
  5. Naimplementuje sami haldu. Zkuste dodržet kostru z 20170919_heap.zip. Zkuste poté použít vaší implementaci v předchozích úkolech a zkontrolujte, že dává stejné výsledky.
  6. Zkontrolujte výsledky. Můžete se podívat také na implementaci. Kódy z roku 2019 v Pythonu jsou k dispozici zde, také z roku 2020.

Další úlohy:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3644

https://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=1895

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3146

  ____________________________________________________________________________________________

Středa 14.9. dopoledne

Vedou Jakub Dupák, Marko Berezovský
Na praktikách asistují Jakub Dupák, Marko Berezovský
.

Dijkstrův algoritmus bez prioritní fronty v čase $\mathcal{O}(m\cdot n)$.

Poučení

Slidy: Dijkstrův algoritmus

Data pro testování Dijkstry: txt, výsledek (jako pro neorientovaný graf), implementace v Javě (2018) a Pythonu (2019).

  ____________________________________________________________________________________________

Středa 14.9. odpoledne

Vedou Jakub Dupák, Dan Hubáček
Na praktikách asistují Jakub Dupák, Dan Hubáček
.

Dijkstrův algoritmus s prioritní frontou v čase $\mathcal{O}((m+n) \cdot \log n)$, možná souvislost s Primovým algoritmem.

Data a slidy stejné jako ráno.

Poučení

courses/laso2022/novacek.txt · Last modified: 2022/09/11 19:21 by berezovs