Dôkaz

Najdôležitejšie a jediné netriviálne tvrdenie našeho riešenia hovorí, že z nespracovaných vrchlov môžeme zobrať vrchol s najkratšou cestou a prehlásiť ho za spracovaný. A že táto dĺžka je skutočne dĺžkou najkratšej cesty, ktorá do neho vedie.

Majme teda nejaké spracované vrcholy a potom nespracované vrcholy, pre ktoré poznáme dĺžku najkratšej cesty vedúcej z $a$ do nich, ktorá vedie iba cez spracované vrcholy. Nech $x$ je nespracovaný vrchol, do ktorého vedie najkratšia takáto cesta a jej dĺžku si označme D[x]. My tvrdíme, že táto cesta je skutočne najktrašia možná z vrchola $a$ do vrchola $x$. Čo by muselo platiť, aby to nebola pravda?

Musela by existovať taká cesta z $a$ do $x$, ktorá je kratšia a vedie cez aspoň jeden ešte nespracovaný vrchol (lebo z tých, čo vedú cez spracované už máme najmenšiu možnosť). Takže najskôr pôjde táto cesta z vrchola $a$ po spracovaných vrchloch a potom prejde do nespracovaných a nejakým spôsobom príde až do vrchola $x$. Avšak, už tá prvá časť má dĺžku aspoň D[x]. Nech $y$ je prvý nespracovaný vrchol, ktorý takáto cesta navštívi. Je jasné, že platí D[x]≤D[y], pretože D[x] bola najkratšia z ciest do nespracovaného vrchola. A ak pôjdeme medzi vrcholmi $y$ a $x$, k tejto dĺžke iba pridáme, pretože všetky naše hrany majú nezápornú dĺžku. Preto je hodnota D[x] naozaj správna.

Toto zároveň ukazuje dôvod, prečo sme vyžadovali nezápornosť hrán. Ak by sa totiž v našom grafe nachádzali záporné hrany, táto podmienka by neplatila a celý Dijkstrov algoritmus by nebol správny. A ak vás napadne, že stačí nájsť najviac zápornú hranu a potom ku každej hrane pripočítať túto hodnotu, čím budú všetky hrany nezáporné, tak to nerobte. Nebude to totiž fungovať, skúste si premyslieť prečo. Ak chcete hľadať najkratšie cesty v grafoch so zápornými hranami, musíte použiť robustnejšie algoritmy, akým je napríklad Floyd-Warshallov algoritmus.