Corrigé HC --- Cours INF 431

Jean Berstel   Jean-Jacques Lévy
Ecole polytechnique, 29 Avril 2003







Question 1 La fonction hauteur(g) prend un temps en O(V+E).
  static int hauteur (Graphe g) {
    int n = g.succ.length; int[ ] rang = new int[n];
    int h = -1;
    for (int x=0; x < n; ++x) rang[x] = -1;
    for (int x=0; x < n; ++x) {
      if (rang[x] == -1)
        calculerRangDe (g, x, rang);
      h = Math.max(h, rang[x]);
    }
    return h;
  }

  static void calculerRangDe (Graphe g, int x, int[ ] rang) {
    int r = 0;
    for (Liste ls = g.succ[x]; ls != null; ls = ls.suivant) {
      int y = ls.val;
      if (rang[y] == -1)
        calculerRangDe (g, y, rang);
      r = Math.max (r, 1 + rang[y]);
    }
    rang[x] = r;
  }


Question 2 
abstract class Ensemble { }

class Vide extends Ensemble { }

class NonVide extends Ensemble {
  int elt;
  Ensemble reste;
  NonVide (int x, Ensemble e) { elt = x; reste = e; }
}


Question 3 
abstract class Ensemble {
  abstract int card ();
  abstract boolean contient (int x);
  abstract Ensemble ajouter (int x);
}

class Vide extends Ensemble {
  int card () { return 0; }
  boolean contient (int x) {return false; }
  Ensemble ajouter (int x) {return new NonVide (x, this); }
  public String toString () { return ""; }
}

class NonVide extends Ensemble {
  int elt;
  Ensemble reste;
  NonVide (int x, Ensemble e) { elt = x; reste = e; }

  int card () { return 1 + reste.card(); }

  boolean contient (int x) {
    return elt == x || reste.contient(x);
  }

  Ensemble ajouter (int x) {
    if ( contient(x) ) return this;
    else return new NonVide (x, this);
  }
}


Question 4 
abstract class Ensemble {
  int prochain (int i, int k) {
    do ++i;
    while (i < k && contient(i));
    return i < k ? i : -1;
  }
}


Question 5 
abstract class Ensemble {...}

class Vide extends Ensemble {
  public String toString () { return ""; }
}

class NonVide extends Ensemble {
  public String toString () { return elt + " " + reste; }
}


Question 6 



Question 7 Si k est suffisamment grand, on peut prendre comme coloriage c(x) = x pour tout sommet x. C'est un coloriage s'il n'y a pas de boucle.


Question 8 
  static void colorier (Graphe g, int k) {
    int n = g.succ.length;
    int[ ] couleur = new int[n];
    for (int x=0; x < n; ++x) couleur[x] = -1;
    colorier1 (g, k, 0, couleur);
  }

  static void colorier1 (Graphe g, int k, int i, int[ ] couleur) {
    int n = g.succ.length;
    if (i == n) imprimerSolution (couleur);
    else {
      Ensemble e = new Vide();
      for (Liste ls = g.succ[i]; ls != null; ls = ls.suivant) {
        int y = ls.val;
        if (couleur[y] != -1)
          e = e.ajouter (couleur[y]);
      }
      for (int c = e.prochain(couleur[i], k); c != -1; c = e.prochain(c, k) ) {
        couleur[i] = c;
        colorier1 (g, k, i+1, couleur);
        couleur[i] = -1;
      }
    }
  }

Cette dernière fonction peut aussi s'écrire sous la forme suivante plus succincte (mais moins claire):


  static void colorier1 (Graphe g, int k, int i, int[ ] couleur) {
    int n = g.succ.length;
    if (i == n) imprimerSolution (couleur);
    else {
      Ensemble e = new Vide();
      for (Liste ls = g.succ[i]; ls != null; ls = ls.suivant) {
        int y = ls.val;
        if (couleur[y] != -1)
          e = e.ajouter (couleur[y]);
      }
      while ((couleur[i] = e.prochain(couleur[i], k)) != -1)
        colorier1 (g, k, i+1, couleur);
    }
  }


This document was translated from LATEX by HEVEA.