FAV-ZCU/KIV PPA2/Prednaska11.md

57 lines
2.3 KiB
Markdown
Raw Normal View History

# 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