FAV-ZCU/KIV PPA2/Prednaska11.md

2.3 KiB
Raw Blame 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