Bellman-Ford
L'algoritmo trova i cammini minimi da una singola sorgente a tutti i nodi di un grafo con possibili pesi negativi, sempre che sia senza cicli negativi, effettuando relax sugli archi:
bellman_ford(G, w, s)
d, 𝜋 = init_ss(G, s)
for i = 1 to G.V.length - 1
for each (u, v) in G.E
relax(u, v, w, d, 𝜋)
for each (u, v) in G.E
if d[v] > d[u] + w(u, v)
return (false, d, 𝜋) // Possiede cicli negativi se c'è ancora un cammino più corto
return (true, d, 𝜋)
La complessità, data da l'init_ss da e dalla relax da chiamata volte, sarà:
Correttezza
L'algoritmo è corretto, perchè se restituisce true si avrà che e è un albero di cammini minimi, altrimenti se restituisce false significa che un ciclo negativo è raggiungibile da .
Della prima situazione si può dimostrare che:
-
Se allora alla fine, siccome non è raggiungibile, anche grazie alla
init_ss. Altrimenti, il cammino minimo semplice , che avrà al più archi, verrà esplorato un nodo alla volta portando a con larelax, per la convergenza. -
, ovvero restituisce
truePer il punto precedente e la disuguaglianza triangolare, la proprietà è verificata.