Dijkstra
L'algoritmo trova i cammini minimi da una singola sorgente a tutti i nodi di un grafo con pesi positivi, effettuando relax
sui vicini dei nodi estratti con distanza minore, similarmente a quello di Prim:
dijkstra(G, w, s)
d, 𝜋 = init_ss(G, s)
Q = G.V
while Q.heap_size > 0
u = extract_min(Q) // Sceglie in base a d
for each v in neighbors(G, u)
relax(u, v, w, d, 𝜋)
return (d, 𝜋)
La complessità dipende da Q
, infatti se è denso conviene usare un array perchè :
altrimenti se è sparso conviene una coda di minima priorità perchè :
Correttezza
L'algoritmo è corretto, perchè alla fine si ha che e è un albero di cammini minimi.
Si può dimostrare la prima affermazione supponendo per assurdo che esista un per cui e che sia il primo nodo per cui capita. In particolare, attraverso le seguenti osservazioni:
-
, perchè perchè non ci sono pesi negativi, quindi
-
All'estrazione di l'insieme , perchè conterrà almeno
-
Si può raggiungere da , ovvero , perchè altrimenti è contro l'ipotesi
-
Nello stato dell'algoritmo dopo l'estrazione di e prima di :
Per il punto 3 esiste un minimo, e dato un in per cui e :
- perchè è il primo per cui l'ipotesi assurda vale
- La
relax
su causa per la convergenza - Dato che si sta per estrarre , allora perchè anche
- perchè è sottocammino di e non ci sono pesi negativi
- per il limite inferiore
Di conseguenza, con le osservazioni 4.5, 4.3, 4.2, 4.4 rispettivamente: ovvero che che però è assurdo, perchè va contro l'ipotesi.