Adloun

Bicolorabilité par un parcours en largeur

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 19 — Parcours de graphes et plus courts chemins

Énoncé

Le chapitre annonce que la bicolorabilité s'obtient « en coloriant alternativement au fil d'un parcours en largeur ». Écrire l'algorithme, et l'appliquer aux cycles et .

Corrigé


(* Renvoie (couleurs, temoin) : temoin vaut Some (u, v) si l'arete u-v joint
   deux sommets de meme couleur, None si le graphe est biparti.
   Precondition : g non oriente, connexe depuis s.
   Complexite : Theta(n + m), celle du parcours. *)
let bicolore g s =
  let n = Array.length g in
  let coul = Array.make n (-1) in
  let f = Queue.create () in
  coul.(s) <- 0; Queue.push s f;
  let temoin = ref None in
  while not (Queue.is_empty f) do
    let u = Queue.pop f in
    List.iter (fun v ->
      if coul.(v) = -1 then begin
        coul.(v) <- 1 - coul.(u);            (* la couleur OPPOSEE *)
        Queue.push v f
      end else if coul.(v) = coul.(u) then temoin := Some (u, v)) g.(u)
  done;
  (coul, !temoin)

Mesures :


C6 : couleurs 0 1 0 1 0 1 ; BIPARTI
C5 : couleurs 0 1 0 0 1   ; PAS biparti (arete 3-2)

Pourquoi cela décide. Le parcours donne : chaque sommet reçoit la parité de sa distance à la source. Deux cas.

L'algorithme rend donc un certificat dans les deux sens : une coloration si le graphe est biparti, une arête fautive sinon — et de cette arête on tire un cycle impair explicite. C'est la réciproque annoncée au chapitre chap:graphes, rendue effective en .

Un détail à ne pas manquer : sur , le témoin mesuré est l'arête , et les couleurs sont — la faute apparaît entre deux sommets tous deux déjà coloriés. Un algorithme qui ne testerait la couleur qu'au moment de la découvrir ne verrait jamais rien : c'est le test du else if qui décide, pas celui du if.

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.