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 la relax, per la convergenza.

  • , ovvero restituisce true

    Per il punto precedente e la disuguaglianza triangolare, la proprietà è verificata.