Dijkstrov algoritmus
Dijkstrov algoritmus je jedným zo základných algoritmov teórie grafov. Jeho primárnym využitím je hľadanie najkratšej cesty v hranovo-ohodnotenom orientovanom grafe G = (V, H, c). Tento graf pozostáva z množiny vrcholov V, množiny orientovaných hrán H a funkcie c, ktorá zobrazuje množinu hrán do množiny reálnych čísel. Teda pre ňu platí H → R. Ďalším predpokladom je aby c(h) ≥ 0, pre všetky hrany h z množiny H. Jeho autorom je holandský matematik E. W. Dijkstra a typovo ide o algoritmus najkratšej cesty z jedného vrcholu (počiatok, označme ho aj s) do ostatných, najčastejšie však do jedného konkrétneho (cieľ d).
Popis samotného algoritmu
Pre každý vrchol grafu G udržiava algoritmus štyri symboly. Prvým je t(v), ktorý zaznamenáva dĺžku doteraz najkratšej cestu z počiatku do vrcholu v. Druhým je x(v), ktorý si pamätá predposledný vrchol cesty s – v, teda vrchol pomocou ktorého sa dostaneme do vrcholu v "najrýchlejšie". Tento symbol nie je priamo potrebným pre beh algoritmu, no má svoje využitie pri spätnej konštrukcii cesty z počiatku do cieľa (prípadne hociktorého iného vrcholu množiny V). Ďalším symbolom je dvojstavová premenná p(v) (pozri údajový typ), určujúca či je doteraz najkratšia nájdená cesta t konečná alebo ňou nie je. Poslednou potrebnou charakteristikou bude riadiaci vrchol r.
Pred samotným behom je potrebné inicializovať už uvedené symboly nasledovne:
- t(v) = ∞, pre všetky v ≠ s; t(s) = 0,
- x(v) = 0, pre všetky v z V,
- p(v) = false, pre všetky v ≠ s; p(s) = true,
- r = s, teda za riadiaci vrchol zvolíme počiatok.
Samotný algoritmus pozostáva z dvoch opakujúcich sa krokov:
- Overíme, či sa d, teda cieľ, nestal riadiacim vrcholom . V takom prípade (r = d) algoritmus končí a jeho výsledkom sú s, ..., x(x(x(d))), x(x(d)), x(d), d (čiže najkratšia s – d cesta) a t(d) (jej dĺžka). Ak však podmienka, že riadiacim vrcholom je d, neplatí, vykonáme nasledujúci úkon: pre všetky hrany tvaru (r, i) z množiny H, pre ktoré platí, že p(i) = false a t(i) > t(r) + c(r, i) upravíme symbol t(i) na t(r) + c(r, i) a značku x(i) nastavíme na r.
- Nájdeme spomedzi všetkých dočasne označených vrcholov v (platí pre ne p(v) = false) taký, ktorého t(v) je najmenšie. Tento vrchol prehlásime za nový riadiaci a jeho značku p(v) nastavíme na true, čo bude znamenať, že t(v) skutočne označuje najkratšiu cestu z vrcholu s do vrcholu v. Ak by nastala situácia, že vrcholov s minimálnym t je viac, môžeme vybrať ľubovoľný z nich. Ďalej pokračujeme vo výpočte prvým krokom.
Ak na konci výpočtu obsahuje t(d) = ∞ (a x(d) = 0), tak je zrejmé, že spojenie s – d neexistuje.
Výpočtová zložitosť
Vo všetkých behoch prvého kroku sa vykoná maximálne |H| = m operácií, keďže každú hranu použijeme nanajvýš raz. V druhom kroku stačí prezrieť maximálne |V| = n vrcholov. Keďže |H| = O(|V|2), výpočtová zložitosť Dijkstrovho algoritmu je O(n2).