Détecter un cycle
Exercice · OCaml (option informatique), chapitre 15 — Parcours de graphes
Énoncé
Écrire a_cycle adj pour un graphe non orienté.
Corrigé
let a_cycle adj =
let n = Array.length adj in
let vu = Array.make n false in
let rec visite s pere =
vu.(s) <- true;
let rec verifie voisins =
match voisins with
| [] -> false
| v :: reste ->
if not vu.(v) then visite v s || verifie reste
else if v <> pere then true (* déjà vu, <> père : cycle ! *)
else verifie reste
in
verifie adj.(s)
in
let rec balaye s =
if s = n then false
else if not vu.(s) then visite s (-1) || balaye (s + 1)
else balaye (s + 1)
in
balaye 0
On effectue un DFS en retenant le pere (le sommet d'où l'on vient). Rencontrer un voisin déjà vu qui n'est pas le père signale un cycle (on est revenu sur ses pas par un autre chemin). Le balaye relance sur chaque composante.
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.