lemon/unionfind.h
changeset 2004 b8f10207e3d6
parent 2003 cf012a7c7f69
child 2006 00d59f733817
equal deleted inserted replaced
5:134d77a67980 6:b446050e3747
   298 
   298 
   299     void insert(const T &a, const T &comp) {
   299     void insert(const T &a, const T &comp) {
   300       
   300       
   301       IIter clit = _find(m[comp]);
   301       IIter clit = _find(m[comp]);
   302       ItemList &c = *clit->my_class;
   302       ItemList &c = *clit->my_class;
   303       c.push_back(ItemType(a,0));
   303       c.push_back(ItemType(a,CIter()));
   304       IIter ai = c.end();
   304       IIter ai = c.end();
   305       --ai;
   305       --ai;
   306       ai->parent = clit;
   306       ai->parent = clit;
   307       m.set(a, ai);
   307       m.set(a, ai);
   308       ++clit->size;
   308       ++clit->size;
   345 	
   345 	
   346 	ItemList &alist = *ca->my_class;
   346 	ItemList &alist = *ca->my_class;
   347 	alist.splice(alist.end(),*cb->my_class);
   347 	alist.splice(alist.end(),*cb->my_class);
   348 
   348 
   349 	classes.erase(cb->my_class);
   349 	classes.erase(cb->my_class);
   350 	// ehem: cb->my_class = 0;
       
   351       }
   350       }
   352       else {
   351       else {
   353 
   352 
   354 	ca->parent = cb->parent;
   353 	ca->parent = cb->parent;
   355 	cb->size += ca->size;
   354 	cb->size += ca->size;
   356 	
   355 	
   357 	ItemList &blist = *cb->my_class;
   356 	ItemList &blist = *cb->my_class;
   358 	blist.splice(blist.end(),*ca->my_class);
   357 	blist.splice(blist.end(),*ca->my_class);
   359 
   358 
   360 	classes.erase(ca->my_class);
   359 	classes.erase(ca->my_class);
   361 	// ehem: ca->my_class = 0;
       
   362       }
   360       }
   363 
   361 
   364       return true;
   362       return true;
   365     }
   363     }
   366 
   364 
   418       IIter ia = m[a];
   416       IIter ia = m[a];
   419       IIter la = _find(ia);
   417       IIter la = _find(ia);
   420       if (la == ia) return;
   418       if (la == ia) return;
   421 
   419 
   422       ia->my_class = la->my_class;
   420       ia->my_class = la->my_class;
   423       // ehem: la->my_class = 0;
       
   424 
   421 
   425       ia->size = la->size;
   422       ia->size = la->size;
   426 
   423 
   427       CIter l = ia->my_class;
   424       CIter l = ia->my_class;
   428       l->splice(l->begin(),*l,ia);
   425       l->splice(l->begin(),*l,ia);
   476 	  i->parent = lai;
   473 	  i->parent = lai;
   477 	--lai->size;
   474 	--lai->size;
   478       }
   475       }
   479 
   476 
   480       ai->parent = clit;
   477       ai->parent = clit;
   481       // ehem: ai->my_class = 0;
       
   482       ++clit->size;
   478       ++clit->size;
   483 
   479 
   484       return true;
   480       return true;
   485     }
   481     }
   486 
   482 
   494      * It is an error to remove an element which is not in the structure.
   490      * It is an error to remove an element which is not in the structure.
   495      */
   491      */
   496     void erase(const T &a) {
   492     void erase(const T &a) {
   497 
   493 
   498       IIter ma = m[a];
   494       IIter ma = m[a];
   499       // ehem: if (ma == 0) return;
       
   500 
   495 
   501       IIter la = _find(ma);
   496       IIter la = _find(ma);
   502       if (la == ma) {
   497       if (la == ma) {
   503 	if (ma -> size == 1){
   498 	if (ma -> size == 1){
   504 	  classes.erase(ma->my_class);
   499 	  classes.erase(ma->my_class);
   505 	  // ehem: m.set(a,0);
       
   506 	  return;
   500 	  return;
   507 	}
   501 	}
   508 	++la;
   502 	++la;
   509 	la->size = ma->size; 
   503 	la->size = ma->size; 
   510 	la->my_class = ma->my_class;	
   504 	la->my_class = ma->my_class;	
   514 	i->parent = la;
   508 	i->parent = la;
   515       }
   509       }
   516 
   510 
   517       la->size--;
   511       la->size--;
   518       la->my_class->erase(ma);
   512       la->my_class->erase(ma);
   519       // ehem: m.set(a,0);
       
   520     }
   513     }
   521 
   514 
   522     /**
   515     /**
   523      * \brief Removes the component of the given element from the structure.
   516      * \brief Removes the component of the given element from the structure.
   524      *
   517      *
   527      * It is an error to give an element which is not in the structure.
   520      * It is an error to give an element which is not in the structure.
   528      */
   521      */
   529 
   522 
   530     void eraseClass(const T &a) {
   523     void eraseClass(const T &a) {
   531       IIter ma = m[a];
   524       IIter ma = m[a];
   532       // ehem: if (ma == 0) return;
       
   533 // #     ifdef DEBUG
       
   534 //       CIter c = _find(ma)->my_class;
       
   535 //       for (IIter i=c->begin(); i!=c->end(); ++i)
       
   536 // 	m.set(i->me, 0);
       
   537 // #     endif
       
   538       classes.erase(_find(ma)->my_class);
   525       classes.erase(_find(ma)->my_class);
   539     }
   526     }
   540 
   527 
   541 
   528 
   542     class ClassIt {
   529     class ClassIt {
   579 	return *this;
   566 	return *this;
   580       }
   567       }
   581 
   568 
   582       // obsoleted:
   569       // obsoleted:
   583       bool valid() const { return l!=0 && i!=l->end(); }
   570       bool valid() const { return l!=0 && i!=l->end(); }
   584     private:
       
   585       //void first(const ClassList &l) { i = l.begin(); validate(l); }
       
   586 //       void next(const ClassList &l) {
       
   587 // 	++i; 
       
   588 // 	validate(l);
       
   589 //       }
       
   590 //       void validate(const ClassList &l) {
       
   591 // 	if ( i == l.end() ) 
       
   592 // 	  i = 0;
       
   593 //       }
       
   594     };
   571     };
   595 
   572 
   596     /**
   573     /**
   597      * \brief Sets the iterator to point to the first component.
   574      * \brief Sets the iterator to point to the first component.
   598      * 
   575      * 
   659 	l = &ufe.classOf(a);
   636 	l = &ufe.classOf(a);
   660 	i = l->begin();
   637 	i = l->begin();
   661       }
   638       }
   662       
   639       
   663       operator const T& () const { return i->me; }
   640       operator const T& () const { return i->me; }
   664       bool operator == (ItemIt it) const {
   641       bool operator == (ItemIt const &it) const {
   665 	return (l==it.l && i==it.i) || (!valid() && !it.valid());
   642 	return (l==it.l && i==it.i) || (!valid() && !it.valid());
   666       }
   643       }
   667       bool operator != (ItemIt it) const {
   644       bool operator != (ItemIt const &it) const {
   668 	return !(*this == it);
   645 	return !(*this == it);
   669       }
   646       }
   670       bool operator < (ItemIt it) const {
   647       bool operator < (ItemIt const &it) const {
   671 	return (i < it.i);
   648 	return (i < it.i);
   672       }
   649       }
   673 
   650 
   674       bool operator==(Invalid) const {
   651       bool operator==(Invalid) const {
   675 	return !valid();
   652 	return !valid();
   683 	return *this;
   660 	return *this;
   684       }
   661       }
   685 
   662 
   686       // obsoleted:
   663       // obsoleted:
   687       bool valid() const { return l!=0 && i!=l->end(); }
   664       bool valid() const { return l!=0 && i!=l->end(); }
   688     private:
       
   689 //       void first(const ItemList &il) { l=&il; i = l->begin(); validate(); }
       
   690 //       void next() {
       
   691 // 	++i; 
       
   692 // 	validate();
       
   693 //       }
       
   694 //       void validate() {
       
   695 // 	if ( i == l->end() ) 
       
   696 // 	  i = 0;
       
   697 //       }
       
   698     };
   665     };
   699 
   666 
   700 
   667 
   701 
   668 
   702     /**
   669     /**