tpl3r20141106.cpp

#include "eval.hpp"
#include <climits>
#include <cstdlib>
#include <stack>

/* COMIENZO DE DESCRIPCION

   __USE_WIKI__

   #only1:#
   Dado un vector de conjuntos #VS,# determinar el conjunto #S1# de todos
   aquellos elementos que estan en uno y solo uno de ellos. Por ejemplo,
   si #VS=[{0,1,2,3},{2,3,4,5}],# entonces #S1={0,1,4,5}.# 

   #included:# Dada un vector de conjuntos, escribir una
   funcion predicado, que determina si los conjuntos del
   vector son subconjuntos propios en forma consecutiva. Es
   decir, si #S_j\subset S_{j+1}# para
   #j=0,...,n-2#. (Recordar que #A\subset B# indica
   inclusion *propia,* es decir #A\subseteq B# y #A\neq B$.#

   #diffh:# Escribir una funcion predicado que determina si
   el arbol esta balanceado, es decir si para cada nodo
   interno del AB la diferencia de alturas de los subarboles
   de su hijo izquierdo y derecho difieren en a lo maximo 1.

   #onechild:# Dado una arbol binario (AB), determinar
   cuantos nodos de tienen exactamente un solo hijo
   *(single child count).*

   [Tomado en el Recup Trabajo Practico de Laboratorio Nro 3 
   (TPL3R) de 2014-11-06].  
   keywords: arbol binario,conjunto

FIN DE DESCRIPCION */

using namespace aed;
using namespace std;

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void only1(vector< set<int> > &VS,set<int> &S1) {
  S1.clear();
  set<int> Sall,s1,s2;
  vector< set<int> >::iterator 
    q = VS.begin();
  while (q!=VS.end()) {
    s2.clear();
    set_difference(S1.begin(),S1.end(),
		   q->begin(),q->end(),
		   inserter(s2,s2.begin()));
    S1 = s2;

    set_difference(q->begin(),q->end(),
		   Sall.begin(),Sall.end(),
		   inserter(S1,S1.begin()));

    s1.clear();
    set_union(q->begin(),q->end(),
	      Sall.begin(),Sall.end(),
	      inserter(s1,s1.begin()));
    Sall = s1;
    q++;
  }
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
bool included(vector< set<int> > &VS) {
  vector<set<int> >::iterator p = VS.begin();
  if (p == VS.end()) return true;

  set<int> tmp;
  while (p != VS.end()) {
    // *p es A[j] y *q es A[j+1]
    vector<set<int> >::iterator q = p; q++;

    // Aseguramos que p y
    // q son dereferenciables
    if (q==VS.end()) break;

    // Verifica que A[j] incluido en A[j+1]
    // es decir, tmp = A[j]-A[j+1] es vacio
    set_difference(*p,*q,tmp);
    if (!tmp.empty()) {
      // printf("NO incluye!!\n");
      return false;
    }

    // Verifica que la inclusion es propia
    // es decir, tmp = A[j+1]-A[j] NO es vacio
    set_difference(*q,*p,tmp);
    if (tmp.empty()) {
      // printf("Inclusion NO propia!!\n");
      return false;
    }

    p=q;	   
  }
  return true;
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
typedef btree<int>::iterator bnode_t;
bool diffh(btree<int> &T,bnode_t n,int &height) {
  height = -1;
  if (n==T.end()) return true;
  bnode_t 
    ql = n.left(),
    qr = n.right();
  int hl,hr;
  height = INT_MAX;
  if (!diffh(T,ql,hl)) return false;
  if (!diffh(T,qr,hr)) return false;
  height = (hl>hr ? hl : hr)+1;
  return abs(hl-hr)<=1;
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
bool diffh(btree<int> &T) {
  int height;
  return diffh(T,T.begin(),height);
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int onechild(btree<int> &T, bnode_t n) {
  if (n==T.end()) return 0;
  bnode_t l=n.left(), r=n.right();
  int nchild = (l==T.end()) + (r==T.end());
  return (nchild==1) + onechild(T,l) + onechild(T,r);
}
             
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// Wrapper
int onechild(btree<int> &T) {
  return onechild(T,T.begin());
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main() {
  Eval ev;
  int vrbs = 0;
  int seed = 123;
  int h1=0,h2=0,h3=0,h4=0;

  ev.eval1(only1,vrbs);
  ev.eval2(included,vrbs);
  ev.eval3(diffh,vrbs);
  ev.eval4(onechild,vrbs);

  h1 = ev.evalr1(only1,seed,0); // para SEED=123 debe dar H=352
  h2 = ev.evalr2(included,seed,0); // para SEED=123 debe dar H=318
  h3 = ev.evalr3(diffh,seed,0); // para SEED=123 debe dar H=304
  h4 = ev.evalr4(onechild,seed,0); // para SEED=123 debe dar H=204

  printf("S=%03d -> H1=%03d H2=%03d H3=%03d H4=%03d\n",
         seed,h1,h2,h3,h4);
  return 0;
}

Generated by GNU Enscript 1.6.6.