Adloun

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

Le cours du chapitre · Tous les exercices du chapitre