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:

  1. , perchè perchè non ci sono pesi negativi, quindi

  2. All'estrazione di l'insieme , perchè conterrà almeno

  3. Si può raggiungere da , ovvero , perchè altrimenti è contro l'ipotesi

  4. 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 :

    1. perchè è il primo per cui l'ipotesi assurda vale
    2. La relax su causa per la convergenza
    3. Dato che si sta per estrarre , allora perchè anche
    4. perchè è sottocammino di e non ci sono pesi negativi
    5. 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.