OCaml (option informatique) · Chapitre 16 · Exercice de TD
Dijkstra
Plus courts chemins : Dijkstra · niveau 2
Énoncé
Écrire dijkstra adj depart renvoyant le tableau des distances minimales.
Corrigé
let dijkstra adj depart =
let n = Array.length adj in
let infini = 1_000_000 in
let dist = Array.make n infini in
let traite = Array.make n false in
dist.(depart) <- 0;
for _i = 0 to n - 1 do
let u = ref (-1) in
for v = 0 to n - 1 do
if not traite.(v) && dist.(v) < infini
&& (!u = -1 || dist.(v) < dist.(!u)) then u := v
done;
if !u <> -1 then begin
traite.(!u) <- true;
List.iter (fun (v, poids) ->
if dist.(!u) + poids < dist.(v) then dist.(v) <- dist.(!u) + poids
) adj.(!u)
end
done;
dist
À chaque tour on fige le sommet non traité le plus proche, puis on relâche ses voisins. Les sommets inatteignables conservent infini.
Exercices semblables
- Distance entre deux sommets corrigé
- Poids unitaires corrigé
- Le contre-exemple des poids négatifs corrigé
- Reconstruire le chemin corrigé
- Floyd-Warshall (toutes les paires) corrigé