Tester la forte connexité en deux parcours
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 24 — Composantes fortement connexes et couplages
Énoncé
Écrire un algorithme qui décide en si un graphe orienté est fortement connexe, sans calculer les composantes. Le démontrer.
Corrigé
(* Le graphe g est-il fortement connexe ?
Entree : g.(u) = liste des successeurs de u, n >= 1 sommets.
Sortie : true ssi tous les sommets sont mutuellement accessibles.
Complexite : Theta(n + m) -- deux parcours et une transposition. *)
let fortement_connexe g =
let n = Array.length g in
let atteint depuis graphe =
let vu = Array.make n false and compte = ref 0 in
let rec descendre u =
vu.(u) <- true; incr compte;
List.iter (fun v -> if not vu.(v) then descendre v) graphe.(u) in
descendre depuis; !compte = n in
let gt = Array.make n [] in
Array.iteri (fun u l -> List.iter (fun v -> gt.(v) <- u :: gt.(v)) l) g;
atteint 0 g && atteint 0 gt
Correction. Notons le sommet de départ.
- Le premier parcours vérifie que atteint tous les sommets.
- Le second vérifie que atteint tous les sommets dans , c'est-à-dire — par l'exercice précédent — que tous les sommets atteignent dans .
Si les deux tiennent, alors pour et quelconques on a : le graphe est fortement connexe. Réciproquement, si le graphe est fortement connexe, les deux parcours réussissent trivialement.
Le point à ne pas manquer : un seul sommet de départ suffit. On pourrait croire qu'il faut essayer tous les sommets ; la forte connexité étant une relation d'équivalence à une seule classe, il suffit de la tester par rapport à un témoin. C'est le même raisonnement qu'en algèbre quand on vérifie qu'un groupe est engendré par un élément.
Complexité : deux parcours en chacun, plus la transposition en . Total , comme Kosaraju — mais avec deux parcours sans pile d'ordre, et sans tableau de composantes. Quand la question est « oui ou non », il ne faut pas calculer plus que la réponse.
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.