diff --git a/KIV PPA2/Prednaska10.md b/KIV PPA2/Prednaska10.md index 5a6d646..be388b1 100644 --- a/KIV PPA2/Prednaska10.md +++ b/KIV PPA2/Prednaska10.md @@ -176,13 +176,14 @@ + zpracovává vrcholy grafu od vrcholu `s` v pořadí **od blízkých ke vzdáleným** + postup vyžaduje označování vrcholů + označení uložíme do pole délky $\vert V\vert$ -+ možná označení vrcholů - + nenavštívený (kód 0) - + čekající na zpracování (kód 1) - + hotový (kód 2) + vrcholy se vkládají do fronty + všechny vrcholy ve vzdálenosti `k` se zpracují před těmi se vzdáleností `> k` +**Značení vrcholů** ++ nenavštívený (kód 0) ++ čekající na zpracování (kód 1) ++ hotový (kód 2) + **Pozorování** - BFS je potřeba doplnit o nějaký užitečný kód + záleží to na řešeném problému diff --git a/KIV PPA2/Prednaska11.md b/KIV PPA2/Prednaska11.md new file mode 100644 index 0000000..9c117a6 --- /dev/null +++ b/KIV PPA2/Prednaska11.md @@ -0,0 +1,57 @@ +# Grafy 2 + +#### Prohledávání do šířky (BFS) + +**Strom dosažitelnosti** +- tvoří se z nějakého určeného vrcholu (kořen) +- ukazuje, jaká je nejkratší cesta do ostatních vrcholů +- reprezentován polem, kde na indexu vrcholu je uložen předek +- nemusí být jednoznačný (může existovat více nejkratších cest) + + +#### Prohledávánı́ do hloubky (DFS) + +- Depth-First Search +- algoritmus postupuje do většı́ vzdálenosti od počátečnı́ho vrcholu, pokud může ++ předpokládáme, že označenı́ (mark) je před volánı́m DFS inicializováno na 0 pro všechny vrcholy ++ DFS je potřeba doplnit o nějaký užitečný kód + + záleží to na řešeném problému + +**Značenı́ vrcholů** +- nezpracovaný (”bı́lá”), kód 0 +- rozpracovaný (”šedá”), kód 1 +- dokončený (”černá”), kód 2 + +**Složitost** +- rekurzivní metoda se pro každý vrchol volá pouze jednou - $\Omega(\vert V\vert)$ +- pro každý vrchol se prochází seznam hran: + - reprezentace maticí - $\Omega(\vert V\vert^2)$ + - reprezentace seznamem - $\mathcal{O}(\vert E\vert)$ +- celkem: $\mathcal{O}(\vert V\vert + \vert E\vert)$ při reprezentaci seznamem + - může být i $\Omega(\vert V\vert^2)$, pokud $\vert E\vert = k\vert V\vert^2$ + +**Použití DFS** +- Zjištění dosažitelnosti vrcholu + - pokud předpokládáme, že bude vrchol daleko, je DFS vhodnější než BFS ++ Zjištění cyklu v grafu + + vrchol označíme jedničkou a poté ho znovu hledáme ++ Topologické řazení + + prvně je potřeba ověřit, že graf nemá cykly + + vrcholy jsou činnosti, hrany jsou závislosti + + hrana $A \to B$ značí, že se prvně musí vykonat A a potom až B + + pomocí DFS můžeme snadno určit pořadí činností (pomocí otočeného grafu) + +**DFS bez rekurze** +- pravděpodobně nastanou problémy s hloubkou zásobníku ++ vystačíme si se zásobníkem celých čísel (vrcholů) ++ `segment` (jaký je stav vrcholu) je v označení vrcholu (`mark`) + +**Nejkratší cesta v ohodnoceném grafu** +- velmi častý problém +- ohodnocení: čas, vzdálenost, ... +- úkol: nalézt nejkratší vzdálenost ke všem vrcholům +- **Dijkstrův algoritmus** + - je potřeba prioritní fronta + - přidání dvojice vrchol + ohodnocení + - vybrání/odebrání vrcholu s nejmenším ohodnocením + - změna ohodnocení vrcholu \ No newline at end of file