Example #1
0
void TarjanHD::run()
{
  _T.clear();

  NodeNodeMap mapToOrgG(_orgG, lemon::INVALID);
  for (NodeIt v(_orgG); v != lemon::INVALID; ++v)
  {
    mapToOrgG[v] = v;
  }
  
  ArcList arcs;
  for (ArcIt a(_orgG); a != lemon::INVALID; ++a)
  {
    arcs.push_back(a);
  }

  // sort by weight
  arcs.sort(Comparison(_orgW));

  BoolArcMap arcFilter(_orgG, true);
  BoolNodeMap nodeFilter(_orgG, true);
  NodeNodeMap G2T(_orgG, lemon::INVALID);
 
  SubDigraph subG(_orgG, nodeFilter, arcFilter);
  
  _root = hd(_orgG, _orgW, subG, mapToOrgG, G2T, arcs, 0);
  fixTree(_root);
}
Example #2
0
void TwoThreeTree::remove(TNode *d) {
    if (root == d) {
        delete d;
        root = NULL;
        return;
    }

    fixTree(d, d->side);
}
Example #3
0
void TwoThreeTree::fixTwoNode(TNode *d, int s) {
    TNode *p = d->parent;
    // get d's sibling.
    TNode *dSib = (s == -1) ? p->middle : p->left;
    delete d;
    
    // base case when d's parent is root
    if (p == root) {
        root = dSib;
        dSib->parent = NULL;
        delete p;
        return;
    }
    
    // connect d's sibling to middle to unify different cases
    connect(dSib, p, 0);
    p->left = NULL;
    p->right = NULL;

    // get p's parent, which is d's grandparent
    TNode *g = p->parent;
    TNode *pSib = NULL;
    
    // get p's sibling
    if (g->rlow == -1)
        pSib = (p->side == -1) ? g->middle : g->left;
    else
        pSib = (p->side == 0) ? g->left : g->middle;
    
    if (pSib->rlow != -1) {
        // if p's sibling is a 3-node, call adoptchild
        adoptChild(p, pSib);
        fixLowVals(p);
    } else {
        // if p's sibling is a 2-node, call lose child
        loseChild(p, pSib);
        // recursively fix p
        fixTree(p, p->side);
    }
}