gatherset.cpp
// $Id$
/* COMIENZO DE DESCRIPCION
__USE_WIKI__
Dado una serie de conjuntos de enteros #S_j#, con #j# en #[0,N_S)#
juntarlos entre si aquellos que tienen al menos un elemento en
comun.
[Tomado en el TPL3 2013-11-09].
keywords: conjunto
FIN DE DESCRIPCION */
#include <cstdio>
#include <iostream>
#include <set>
#include <list>
#include <algorithm>
#include "./util.h"
using namespace std ;
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
#define STERM -1
#define TERM -2
int velem[]={5,7,11,STERM,0,1,3,STERM,1,2,10,STERM,7,13,22,STERM,TERM};
typedef list< set<int> > ls_t;
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void printls(ls_t &ls) {
ls_t::iterator q = ls.begin();
int j=0;
while (q!=ls.end()) {
set<int> &S= *q++;
printf("S[%d]= {",j++);
set<int>::iterator s = S.begin();
while (s!=S.end()) printf("%d ",*s++);
printf("}\n");
}
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void prints(const set<int> &S,const char*label=NULL) {
if (label) printf("%s={",label);
printf("{");
set<int>::iterator s = S.begin();
while (s!=S.end()) printf("%d ",*s++);
printf("}\n");
}
//--------------------------------------------------------------------
void gatherset(ls_t &S,ls_t &W) {
W.clear();
while (!S.empty()) {
set<int> tmp = *S.begin();
S.erase(S.begin());
ls_t::iterator q = W.begin();
while (q!=W.end()) {
set<int> &w = *q, aux;
set_intersection(tmp.begin(),tmp.end(),w.begin(),w.end(),
inserter(aux,aux.begin()));
if (!aux.empty()) {
tmp.insert(w.begin(),w.end());
q = W.erase(q);
} else q++;
}
W.push_back(tmp);
}
}
//--------------------------------------------------------------------
int main() {
ls_t S,W;
int j=0,x;
while (1) {
set<int> tmp;
while (1) {
x = velem[j++];
if (x==TERM) break;
if (x==STERM) {
S.push_back(tmp);
break;
}
tmp.insert(x);
}
if (x==TERM) break;
}
printls(S);
gatherset(S,W);
printls(W);
return 0;
}
Generated by GNU Enscript 1.6.6.