====== Letní Algoritmické Soustředění LASO 2016 ====== . ====== Začátečníci ====== ^ Kde: Laboratoř KN:E-220 ^ [[http://www.fel.cvut.cz/cz/glance/rooms.html|Situační plánek]] **Program** ^ Den ^ Dopoledne 9:00-12:15 \\ teorie - výklady - ukázky ^ Odpoledne 13:30 – 17:00 \\ praxe - programování - diskuse ^ | **Po** \\ **19.9.** | Graf, grafové pojmy a grafové vlastnosti, reprezentace grafu v paměti. \\ Přehled hlavních grafových úloh. \\ Neformální výklad asymptotické složitosti, ukázky na kódech, O/Θ/Ω notace. | Úlohy k dopoledni, zpracovat programově co nejvíce grafů. \\ Bez BFS jen lokální vlastnosti, počet trojúhelníků apod. | | **Út** \\ **20.9.** | BFS, DFS, fronta, zásobník \\ Prioritní fronta, halda. | Seznámení s Graphviz, úlohy k dopoledni, \\ jednoduché prohledávání grafu. | | **St** \\ **21.9.** | Dijkstra s prioritní frontou. \\ Porovnání efektivity probraných postupů. \\ Přehled řešitelných a neřešitelných úloh\\ | Úlohy k dopoledni | | Celkem | **Napište nám své připomínky a komentáře:** [[https://docs.google.com/a/fel.cvut.cz/forms/d/1qryIB5xyRc2ckoo5hxDPVve1TmiWZslCkCu6axW896A| Reakce účastníků LASO ]] | .. | ====== Pondělí ====== **Slidy:** {{:courses:laso2016:grafy_uvod.pptx| Úvodní grafový přehled }} **Rychlost kódu:** Najděte v poli obsahujícím kladná i záporná čísla souvislý úsek s maximálním součtem. Diskuse řešení kubického, kvadratického i lineárního.\\ **Úloha 0:** Naprogramujte si všechna tři řešení. // Obsah pole: // V a[] jsou pomocne hodnoty, je to tzv. linearni kongruentni generator pseudonahodnych cisel. // Pozor, v a[] pracujeme s longy, tj. 64-bitovymi cisly. a[0] = 123456; a[i+1] = (a[i]*22695477+1) % 4294967296; NasePole[i] = a[i] - 1580030168; ^ 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 | {{ :courses:laso2016:g3_1.jpg?150 |}} | **Ú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 {{:courses:laso2016:g1.zip| 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 {{:courses:laso2016:g2.zip| 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 {{:courses:laso2016:g3.zip| 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 {{:courses:laso2016:g4.zip| 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 {{:courses:laso2016:g5.zip| 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. **Ú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. ====== Úterý ====== **Slidy:** {{:courses:laso2016:20160920_BSF_DFS_queue_stack_pq_heap.pdf| Prohledávání grafu, halda }} **Úlohy na odpoledne:** - Stáhněte soubor s {{:courses:laso2016:20160920_data_laso_zac.zip| daty}}, se kterými budete pracovat. - 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 '' a ''remove''. Příkaz ''insert '' vloží číslo '''' do zásobníku. Příkaz ''remove'' odstraní prvek ze zásobníku a vypíše ho na standardní výstup. - [Dobrovolné] Sami naimplementujte zásobník a zopakujte úkoly z bodu 2. s vaší implementací. Zkontrolujte, že se výsledky shodují. - To samé jako 2., pouze použijte frontu. - [Dobrovolné] To samé jako 3., pouze implementujte frontu. - Načtěte graf ''graph.txt'' jako neorientovaný graf. Ten je definovaný ve stejném formátu jako včera. - Určete jaké vrcholy lze navštívit z vrcholu 0. Kolik jich je? - Jaká je délka nejkratší cesty z vrcholu 0 do vrcholu 7. - 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ů {{http://mathworld.wolfram.com/WeaklyConnectedComponent.html | zde}} a {{https://en.wikipedia.org/wiki/Connected_component_(graph_theory) | zde}}. - Nyní načtěte graf ''graph.txt'' jako orientovaný graf. - Zopakujte úkoly 7. a 8. (abychom zvládli 9. pro orientovaný graf, museli bychom umět buď {{https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm | Tarjanův algoritmus}} nebo {{https://en.wikipedia.org/wiki/Kosaraju%27s_algorithm | Kosarajiho algoritmus}}) - Zopakujte úkol 2., pouze místo zásobníku použijte haldu. Operaci ''remove'' chápejte jako ''extract-min''. - 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. - Porovnejte časy běhu z kroků 12. a 13. - 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. - Zkontrolujte {{:courses:laso2016:20160920_solutions.zip | výsledky}}. Můžete se podívat také na implementaci. **Úlohy na odpoledne (středně těžké):** - https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=116&page=show_problem&problem=1549 - http://www.spoj.com/problems/PT07Y/ - http://www.spoj.com/problems/CERC07K/ - http://www.spoj.com/problems/MAKEMAZE/ **Úlohy na odpoledne (většinou těžší):** - https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=865 - https://open.kattis.com/problems/torn2pieces - https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=168&page=show_problem&problem=485 - https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=171&page=show_problem&problem=1720 - https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=175&page=show_problem&problem=556 - https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=182&page=show_problem&problem=867 - https://open.kattis.com/problems/rings - https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=58 - https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=16&page=show_problem&problem=1351 **Graphviz:** * {{:courses:laso2016:graphviz_uvod.pptx| úvodní seznámení }}. * [[http://www.graphviz.org/|Stáhněte si, instalujte a experimentujte]]. ====== Středa ====== **Slidy:** {{:courses:laso2016:20160921_Dijkstra.pdf| Dijkstrův algoritmus }} **Data pro testování Dijkstry:** {{:courses:laso2016:graphWeighted.txt | txt}}, {{:courses:laso2016:result.txt | výsledek}}, {{:courses:laso2016:20160921_source_dijkstra.zip | vzorová implementace}} **Úlohy na odpoledne (lehké):** * https://projecteuler.net/problem=18 a https://projecteuler.net/problem=67 **Úlohy na odpoledne (středně těžké):** * https://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=464 * https://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=870 * http://www.spoj.com/problems/MICEMAZE/ **Úlohy na odpoledne (těžké):** * https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1341 * https://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=1544 * https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=164&page=show_problem&problem=1742