Algoritmo di Bellman Ford
Input: grafo senza cicli negativi funzione di costo non negativa sugli archi nodo sorgente Output: albero dei cammini minimi con radice
L’algoritmo di Dijkstra, se ci sono archi con pesi negativi, non va più bene. Il mondo fermo non può esistere. Quindi nell’algoritmo di Bellman Ford si hanno solo la frontiera e il mondo lontano.
Bellman-Ford(G, c, s):
for all u ∈ V do
dist[u] := +∞
prev[u] := 0
dist[s] := 0
for i = 1 to |V| - 1 do
for all (u, v) ∈ E do
if dist[v] > dist[u] + c(u, v) then
dist[v] := dist[u] + c(u, v)
prev[v] := u
return prev[]
Costo computazionale
Per evitare di calcolare cicli negativi, si può implementare un controllo
Bellman-Ford(G, c, s):
for all u ∈ V do
dist[u] := +∞
prev[u] := 0
dist[s] := 0
for i = 1 to |V| - 1 do
for all (u, v) ∈ E do
if dist[v] > dist[u] + c(u, v) then
dist[v] := dist[u] + c(u, v)
prev[v] := u
for all (u, v) ∈ E do
if dist[v] > dist[v] + c(u, v) then
return "ciclo negativo"
return prev[]