Grafy a vyhladavanie (cv 9.)
Plan na cvicenie
Na 9. cvicenie nastudovat prednasku PT09.pdf
Konkretne z PT09:- Hľadanie do hĺbky (DFS)
- Hľadanie do šírky (BFS)
- Orientovaný graf
- Neorientovaný graf
- Hranovo-ohodnotený graf
- Reprezentacia grafov
- Najkratšia cesta
- Dijkstrov algoritmus
- Bellman-Ford algoritmus
Dijkstrov algoritmus
Mějme graf G
, v němž hledáme nejkratší cestu. Řekněme, že V
je množina všech vrcholů grafu G
a množina E
obsahuje všechny hrany grafu G
. Algoritmus pracuje tak, že si pro každý vrchol v
z V
pamatuje délku nejkratší cesty, kterou se k němu dá dostat. Označme tuto hodnotu jako d[v]
. Na začátku mají všechny vrcholy v hodnotu d[v]=∞
, kromě počátečního vrcholu s
, který má d[s]=0
. Nekonečno symbolizuje, že neznáme cestu k vrcholu.
Dále si algoritmus udržuje množiny Z
a N
, kde Z
obsahuje už navštívené vrcholy a N
dosud nenavštívené. Algoritmus pracuje v cyklu tak dlouho, dokud N
není prázdná. V každém průchodu cyklu se přidá jeden vrchol vmin
z N
do Z
, a to takový, který má nejmenší hodnotu d[v]
ze všech vrcholů v
z N
.
Pro každý vrchol u
, do kterého vede hrana (označme její délku jako l(vmin,u)
) z vmin
, se provede následující operace: pokud (d[vmin] + l(vmin,u)) < d[u]
, pak do d[u]
přiřaď hodnotu d[vmin] + l(vmin,u)
, jinak neprováděj nic.
Až algoritmus skončí, potom pro každý vrchol v
z V
je délka jeho nejkratší cesty od počátečního vrcholu s
uložena v d[v]
.
Pseudokód
function Dijkstra(E, V, s): for each vertex v in V: // Inicializace d[v] := infinity // Zatím neznámá vzdálenost z počátku s do vrcholu v p[v] := undefined // Předchozí vrchol na nejkratší cestě z počátku s k cíli d[s] := 0 // Vzdálenost z s do s N := V // Množina všech dosud nenavštívených vrcholů. Na začátku všech vrcholů. while N is not empty: // Samotný algoritmus u := extract_min(N) // Vezměme "nejlepší" vrchol for each neighbor v of u: alt = d[u] + l(u, v) // v 1. smyčce cyklu u je s d[u] = 0 if alt < d[v] d[v] := alt p[v] := u
V případě, že nás zajímá pouze nejkratší cesta mezi zdrojovým a cílovým vrcholem, můžeme ukončit hledání na řádce 9 if u = target. Cestu ze zdroje do cíle pak zjistíme cyklem:
S := empty sequence u := target while defined p[u] insert u at the beginning of S u := p[u]
Zdroj: Wikipédia
Uloha 8
Pouzite kod z Ulohy 7 (Binarny vyhladavaci strom), ktory naplnite.
- 1. Potom vyvorite funkciu na Hladanie do hlbky s obmedzenim na zadanu hlbku.
- 2. Potom vyvorite funkciu na Hladanie do sirky.
Uloha 9
Vytvorte a naplnte
- 1. Neorientovaný graf
- 2. Orientovaný graf
- 3. Kladne Hranovo-ohodnotený graf
4. Naprogramujte Dijkstrov algoritmus a pouzite ho na najdenie najkratsej cesty z daneho uzla v kladne Hranovo-ohodnotenom grafe.
Uloha 10
Vytvorte a naplnte
- 1. Neorientovaný graf
- 2. Orientovaný graf
- 3. Hranovo-ohodnotený graf (nech obsahuje aj zaporne ohodnotenia)
4. Naprogramujte Bellman-Ford algoritmus a pouzite ho na najdenie najkratsej cesty z daneho uzla v Hranovo-ohodnotenom grafe (nech obsahuje aj zaporne ohodnotenia).
Checklist ;)
Prihláste sa s AIS ID a odškrtnite si úlohy čo ste už urobili a tým mi pomôžete zistiť ako stíhate na cvičení či aj mimo cvičenia.
- Uloha 8.17
- Uloha 8.26
- Uloha 9.16
- Uloha 9.26
- Uloha 9.36
- Uloha 9.42
- Uloha 10.14
- Uloha 10.24
- Uloha 10.32
- Uloha 10.40