Adloun

Compter les composantes connexes

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 23 — Unir & trouver, arbres couvrants

Énoncé

On veut le nombre de composantes connexes d'un graphe non orienté donné par sa liste d'arêtes. Comparer la solution par unir & trouver et la solution par parcours en profondeur : code, complexité, et cas où l'une bat l'autre.

Corrigé

Par unir & trouver — il n'y a rien à écrire, le compteur de l'exercice « Ce que la structure refuse de faire » fait tout :


(* Nombre de composantes connexes. Entrees : n sommets, liste d'aretes (u,v).
   Complexite : O(m alpha(n)), soit O(m) en pratique. *)
let composantes n aretes =
  let u = creer n in
  List.iter (fun (a, b) -> ignore (unir u a b)) aretes;
  u.classes

Correction : invariant de la boucle — après traitement d'un préfixe des arêtes, les classes de la structure sont exactement les composantes connexes du graphe partiel formé de ce préfixe. Il tient à l'initialisation ( sommets isolés) et se conserve à chaque arête. Terminaison : la liste est finie.

Par parcours : on construit les listes d'adjacence, puis on lance un parcours depuis chaque sommet non encore visité et l'on compte les lancements. Complexité , c'est-à-dire mieux que à la constante près, et sans structure annexe.

Alors pourquoi unir & trouver ? Parce que les deux ne répondent pas à la même question.

Une simulation le rend concret : en tirant des arêtes au hasard entre sommets jusqu'à ce que le graphe soit connexe, il en faut en moyenne (mesuré sur tirages) ; la théorie du collectionneur de vignettes prévoit . Avec un parcours, il aurait fallu tout recommencer après chaque arête ; avec unir & trouver, le compteur descend tout seul.

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.