Adloun

Graphe biparti

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

Énoncé

Écrire est_biparti adj : peut-on colorier les sommets en deux couleurs sans que deux voisins partagent la même ?

Corrigé

let est_biparti adj =
  let n = Array.length adj in
  let couleur = Array.make n (-1) in       (* -1 non colorié, 0 ou 1 *)
  let ok = ref true in
  let f = Queue.create () in
  for depart = 0 to n - 1 do
    if couleur.(depart) = -1 then begin
      couleur.(depart) <- 0;
      Queue.push depart f;
      while not (Queue.is_empty f) do
        let s = Queue.pop f in
        List.iter (fun v ->
          if couleur.(v) = -1 then begin
            couleur.(v) <- 1 - couleur.(s); Queue.push v f
          end
          else if couleur.(v) = couleur.(s) then ok := false
        ) adj.(s)
      done
    end
  done;
  !ok

Un BFS colorie chaque sommet de la couleur opposée à son prédécesseur. Si l'on rencontre un voisin déjà colorié de la même couleur, le graphe n'est pas biparti (il contient un cycle impair). La boucle externe traite toutes les composantes.

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.