Bellman-Ford (poids négatifs)
Exercice · OCaml (option informatique), chapitre 16 — Plus courts chemins : Dijkstra
Énoncé
Écrire bellman_ford n aretes depart (arêtes (u, v, poids), poids éventuellement négatifs, sans cycle de poids négatif).
Corrigé
let bellman_ford n aretes depart =
let infini = 1_000_000 in
let dist = Array.make n infini in
dist.(depart) <- 0;
for _i = 1 to n - 1 do (* n-1 passes *)
List.iter (fun (u, v, poids) ->
if dist.(u) < infini && dist.(u) + poids < dist.(v) then
dist.(v) <- dist.(u) + poids
) aretes
done;
dist
On relâche toutes les arêtes, n-1 fois de suite. Comme un plus court chemin a au plus n-1 arêtes, n-1 passes suffisent à propager les bonnes distances. Plus lent que Dijkstra () mais il gère les poids négatifs (et une n-ième passe qui améliorerait encore révélerait un cycle de poids négatif).
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.