isindep.cpp
/* COMIENZO DE DESCRIPCION
__USE_WIKI__
escribir un predicado
#bool is_indep(map<int, set<int> >&G,set<int>&S);#
que determina si #S# es un conjunto
_independiente_ de #G#. Se dice que #S# es un conjunto
independiente de #G#, si para cada par de vertices de #S#, NO existe una
arista que los une en #G#.
[Tomado en tercer parcial 2011-11-24].
keywords: conjunto, grafo
FIN DE DESCRIPCION */
// -------------------------------------------------------------------
#include <cstdio>
#include <cassert>
#include <list>
#include <map>
#include <set>
#include <string>
using namespace std;
typedef map<int, set<int> > graph_t;
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
bool is_indep(graph_t &G,set<int> &S) {
set<int>::iterator q = S.begin(),r;
// chequea que todos los indices en S
// sean relamente nodos del grafo (o sea claves del map)
while (q!=S.end())
if (G.find(*q++)==G.end())
return false;
q = S.begin();
// q itera sobre los vertices incluidos en S
while (q!=S.end()) {
// `qngbrs' es el conjunto de vertices adyacentes a q
set<int> &qngbrs = G[*q];
// r itera sobre los restantes vertices de S (a partir
// del siguiente a q).
// Chequea que r no este entre los vecinos de q
r=q; r++;
while (r!=S.end())
if (qngbrs.find(*r++)!=qngbrs.end()) return false;
q++;
}
return true;
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int modulo(int n,int m) {
int r = n%m;
if (r<0) r+= m;
return r;
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main() {
// simple 1D graph
// Crea un simplisimo grafo 1D con N vertices
// en forma de circulo
for (int N=5; N<10; N++) {
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));
}
// Cuando N es par los pares y los impares
// son independientes. Cuando N es impar los
// pares NO son independientes y los impares si
for (int start=0; start<2; start++) {
// start=0 -> mira el conjunto de los PARES
// start=1 -> mira el conjunto de los IMPARES
set<int> S;
for (int j=start; j<N; j+=2) S.insert(j);
int calc = is_indep(G,S);
int correct = N%2==0 || start==1;
printf("N par %d, S=%s, es independiente? "
"calculado %d, correcto %d, OK? %d\n",
N,(start? "impares" : "pares "),calc,correct,calc==correct);
}
}
return 0;
}
Generated by GNU Enscript 1.6.6.