COIN-OR::LEMON - Graph Library

Changeset 481:54d8feda437b in lemon-0.x for src/work/johanna/unionfind.h


Ignore:
Timestamp:
04/29/04 18:45:40 (17 years ago)
Author:
beckerjc
Branch:
default
Phase:
public
Convert:
svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@638
Message:

Three new methods in UnionFindEnum?.
UnionFindEnum? completed.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/work/johanna/unionfind.h

    r462 r481  
    265265
    266266    /**
     267     * \brief Insert the given element into the component of the others.
     268     *
     269     * This methods insert the element \e a into the component of the
     270     * element \e comp.
     271     */
     272
     273    void insert(const T &a, const T &comp) {
     274     
     275      IIter clit = _find(m[comp]);
     276      ItemList &c = *clit->my_class;
     277      c.push_back(ItemType(a,0));
     278      IIter ai = c.end();
     279      --ai;
     280      ai->parent = clit;
     281      m.set(a, ai);
     282      ++clit->size;
     283    }
     284
     285
     286    /**
    267287     * \brief Find the leader of the component of the given element.
    268288     *
     
    384404      ia->parent = ia;
    385405      la->parent = ia;
     406    }
     407
     408    /**
     409     * \brief Move the given element to an other component.
     410     *
     411     * This method moves the element \e a from its component
     412     * to the component of \e comp.
     413     * If \e a and \e comp are in the same component then
     414     * it returns false otherwise it returns true.
     415     */
     416
     417    bool move(const T &a, const T &comp) {
     418
     419      IIter ai = m[a];
     420      IIter lai = _find(ai);
     421      IIter clit = _find(m[comp]);
     422
     423      if (lai == clit)
     424        return false;
     425
     426      ItemList &c = *clit->my_class;
     427
     428      bool is_leader = (lai == ai);
     429      bool singleton = false;
     430
     431      if (is_leader) {
     432        ++lai;
     433      }
     434
     435      c.splice(c.end(), *lai->my_class, ai);
     436
     437      if (is_leader) {
     438        if (ai->size == 1) {
     439          classes.erase(ai->my_class);
     440          singleton = true;
     441        }
     442        else {
     443          lai->size = ai->size;
     444          lai->my_class = ai->my_class;
     445        }
     446      }
     447      if (!singleton) {
     448        for (IIter i = lai; i != lai->my_class->end(); ++i)
     449          i->parent = lai;
     450        --lai->size;
     451      }
     452
     453      ai->parent = clit;
     454      ai->my_class = 0;
     455      ++clit->size;
     456
     457      return true;
    386458    }
    387459
Note: See TracChangeset for help on using the changeset viewer.