Adloun

DFS itératif avec pile explicite

Exercice · OCaml (option informatique), chapitre 15 — Parcours de graphes

Énoncé

Réécrire le parcours en profondeur avec une Stack explicite, sans récursion.

Corrigé

let dfs_iteratif adj depart =
  let n = Array.length adj in
  let vu = Array.make n false in
  let p = Stack.create () in
  let ordre = ref [] in
  Stack.push depart p;
  while not (Stack.is_empty p) do
    let s = Stack.pop p in
    if not vu.(s) then begin
      vu.(s) <- true;
      ordre := s :: !ordre;
      List.iter (fun v -> if not vu.(v) then Stack.push v p) adj.(s)
    end
  done;
  !ordre

La pile remplace la pile d'appels de la version récursive. Subtilité : un sommet peut être empilé plusieurs fois (par différents voisins) ; on le marque donc au moment où on le dépile, et l'on ignore les doublons déjà vus. Remplacer la Stack par une Queue transformerait ce DFS en BFS — preuve que c'est la structure (pile ou file) qui distingue les deux parcours.

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.