Dijsktrov algoritmus na hľadanie najkratšej cesty z jedného vrchola

Untitled.png

Vieme previesť na riešenie pomocou prehľadávania do šírky ... každú hranu nahradíme daným počtom hrán.

Postupne do prioritného radu pridávame nové cesty (z novo pridaného vrcholu) a vyberáme najmenšiu hodnotu (iná implementácia ako na PAZ1b, neprepisujeme hodnoty)

Začneme vo vrchole A, vytvoríme prioritný rad obsahujúci:

(0, 'A') ... vzdialenosť od počiatočného vrchola, vrchol

Z radu vyberieme najmenšiu hodnotu a pridáme hrany z nej idúce a vypočítame vzdialenosti:

(7, 'B')
(5, 'D')

Vyberieme najmenšiu hodnotu 5 (teda D má definitívnu vzdialenosť 5) a pridáme susedov:

(7, 'B')
(5+5=10, 'A') ... nepridáme, lebo A už má priradenú hodnotu
(5+9=14, 'B')
(5+15=20, 'E')
(5+6=11, 'F')

Vyberieme 7 - B :

(14, 'B')
(20, 'E')
(11, 'F')
(7+7=14, 'E')
(7+8=15, 'C')

Musíme si pamätať, ktoré vrcholy som už spracoval (tie hrany nepridávame a pri vybratí z prioritného radu ich preskočíme).

Untitled.png

Zoznam hrán

7 11
A B 7
A D 5
B C 8
...

Matica susednosti

stĺpce aj riadky sú vrcholy, hodnota na políčku reprezentuje vzdialenosť medzi nimi (-1/None ak neexistuje)

Zoznam susedov

susedia = { 'A' : [ ('B', 7), ('D', 5) ], ... }

$G = (V, E)$

$n = |V|$ ... počet vrcholov

$m = |E|$ ... počet hrán

$\deg_G (v)$ ... stupeň vrchola, počet susedov

reprezentácia sú susedné vymenovať susedov pamäť
zoznam hrán $O(m)$ $O(m)$ $O(m)$
matica susednosti $O(1)$ $O(n)$ $O(n^2)$
zoznam susedov $$O\left(\deg v \right) \subset O(n)$$ $$O\left(\deg v \right) \subset O(n)$$ $$O\left(\sum \deg v\right) = O(m)$$

Pokračuje do nekonečná, hľadá všetky sledy (cesta s opakujúcimi sa hranami) ... na začiatku vidíme, že pridalo (A, 10) ..

Zapamätáme si, ktoré vrcholy sme už spracovali (máme finálnu vzdialenosť).

vidíme, že pridalo aj hrany do už spracovaných vrcholov ...

Celková zložitosť tejto implementácie je $O(n+m)$.