OCaml (option informatique) · Chapitre 15 · Exercice de TD
Plus court chemin (reconstruit)
Parcours de graphes · niveau 3 (difficile)
É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).
Exercices semblables
- Composantes connexes corrigé
- Deux sommets sont-ils reliés ? corrigé
- Détecter un cycle corrigé
- Graphe biparti corrigé
- DFS itératif avec pile explicite corrigé