Algoritmus

Dijkstrov algoritmus funguje nasledovne. Počas celého výpočtu sú vrcholy rozdelené do dvoch množín. Na spracované a nespracované. O každom spracovanom vrchole poznáme dĺžku najkratšej cesty z vrchola $a$ doň. A pre každý nespracovaný vrchol si pamätáme dĺžku najkratšej cesty z $a$ doň, pričom táto cesta vedie iba cez už spracované vrcholy. Kým však pre spracované vrcholy platí, že dĺžka cesty, ktorú si pre ne pamätáme je určite najkratšia, pre nespracované vrcholy to platíť nemusí. Na začiatku sú všetky vrcholy nespracované a jedinú hodnotu, ktorou si môžeme byť istý je, že cesta z vrchola $a$ do vrchola $a$ má dĺžku 0.

Následne náš algoritmus vyberie nespracovaný vrchol, pre ktorý si aktuálne pamätáme najkratšiu cestu. Táto hodnota bude skutočne najkratšou cestou do z vrchola $a$ do tohto vrchola a preto môžeme tento vrchol označiť za spracovaný a podľa toho príslušne upraviť zvyšné hodnoty. Tento krok je podstatou fungovania Dijkstrovho algoritmu a jeho správnosť si dokážeme v ďalšej časti.

Najskôr si však vysvetlime, ako budeme upravovať naše hodnoty. Nech $x$ je vrchol, ktorý prehlásime za spracovaný a V[x] je dĺžka najkratšej cesty z vrchola $a$ do vrchola $x$. Táto zmena ovplyvní iba vrcholy, ktoré s vrcholom $x$ susedia. Pozrieme sa teda postupne na všetkých jeho susedov. Ak je jeho sused už spracovaný, nemusíme robiť nič, lebo preň už máme správnu odpoveď. Ak je však jeho sused, ktorého si označíme $y$, nespracovaný, s pridaním $x$ medzi spracované vrcholy sme mohli nájsť kratšiu cestu z $a$ do $y$, ktorá vedie cez už spracované vrcholy. Dĺžka takejto cesty je súčet V[x] a dĺžky hrany medzi $x$ a $y$. Pozrieme sa teda, či táto nová hodnota je lepšia, ako posledá hodnota, ktorú sme si pre $y$ pamätali. Ak áno, tak si zapamätáme túto novú hodnotu.

Naviac, po tom ako náš algoritmus skončí, tak budeme poznať dĺžku najkratšej cesty z vrchola $a$ do všetkých ostatných vrcholov, nie len do vrchola $b$, ktorý ak ste si všimli, sme celý čas vlastne ignorovali.