Adloun

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.