verifcolor.cpp

/* COMIENZO DE DESCRIPCION

   __USE_WIKI__
   Dado un grafo #map<int, set<int> >G# y una coloracion
   #map<int,string> C# determinar si #C# es una coloracion valida, es
   decir si dados dos vertices adyacentes #x#, #y# de #G# sus colores
   son diferentes. 
   [Tomado en tercer parcial 2011-11-24].
   keywords: conjunto, grafo

  FIN DE DESCRIPCION */
#include <cstdio>
#include <cassert>

#include <map>
#include <set>
#include <string>

using namespace std;

typedef map<int, set<int> > graph_t;
bool verif_color(graph_t &G,map<int,string> &C) {
  // q itera sobre los vertices del grafo
  graph_t::iterator q = G.begin();
  while (q!=G.end()) {
    int vrtx = q->first;
    assert(C.find(vrtx)!=C.end());
    // qcolor es el color de q
    string &qcolor = C[vrtx];
    // Vecinos de q
    set<int> &ngbrs = q->second;
    // r itera sobre los vecinos de q
    set<int>::iterator r = ngbrs.begin();
    while (r!=ngbrs.end()) {
      assert(C.find(*r)!=C.end());
      // rcolor es el color de r
      string &rcolor = C[*r];
      // Chequea que no tengan el mismo color
      if (qcolor==rcolor) return false;
      r++;
    }
    q++;
  }
  return true;
}

int modulo(int n,int m) {
  int r = n%m;
  if (r<0) r+= m;
  return r;
}

int main() {
  for (int N=10; N<=15; N++) {
    // Crea un simplisimo grafo 1D con N vertices
    // en forma de circulo
    graph_t G;
    for (int j=0; j<N; j++) {
      set<int> &ngbrs = G[j];
      ngbrs.insert(modulo(j+1,N));
      ngbrs.insert(modulo(j-1,N));
    }

    // Asigna rojo a los impares y negro a los pares
    map<int,string> C;
    for (int j=0; j<N; j++) 
      C[j] = (modulo(j,2) ? "red" : "black");
  
    // Chequea la coloracion, deberia dar
    // que es valida para N par
    printf("N %d, valid coloring? %d\n",N,verif_color(G,C));
  }
  return 0;
}

Generated by GNU Enscript 1.6.6.