Plus court chemin (reconstruit)
Exercice · OCaml (option informatique), chapitre 15 — Parcours de graphes
Énoncé
Écrire plus_court_chemin adj depart arrivee : int list option renvoyant un plus court chemin (en nombre d'arêtes), ou None.
Corrigé
let plus_court_chemin adj depart arrivee =
let n = Array.length adj in
let pere = Array.make n (-1) in
let vu = Array.make n false in
let f = Queue.create () in
vu.(depart) <- true;
Queue.push depart f;
while not (Queue.is_empty f) do
let s = Queue.pop f in
List.iter (fun v ->
if not vu.(v) then begin
vu.(v) <- true; pere.(v) <- s; Queue.push v f
end
) adj.(s)
done;
if not vu.(arrivee) then None
else
let rec remonte s =
if s = depart then [depart] else remonte pere.(s) @ [s]
in
Some (remonte arrivee)
On enregistre, lors du BFS, le pere par lequel chaque sommet a été atteint (sur son plus court chemin). On reconstruit ensuite le chemin en remontant les pères de arrivee jusqu'au depart. Même idée que la reconstruction en programmation dynamique (chapitre 13).
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.