Пример #1
0
//=================================================================
void PlanarityTestImpl::calcNewRBCFromTerminalNode(node newCNode,
    node n,
    node n1,
    node n2,
    tlp::BmdList<node>& nodeList) {
  node t = n1;
  node predT = NULL_NODE;
  node parentT = NULL_NODE;

  while (t != n2) {
    parentT = parent.get(t.id);

    //    cout << "Tulip t =  " << t.id << "  : ";
    if (isCNode(t)) {
      //      cout << "Is CNode" << endl;
      t = activeCNodeOf(false, t);
      addOldCNodeRBCToNewRBC(t, newCNode, n, predT, NULL_NODE, nodeList);
      parentT = parent.get(t.id);
      parent.set(t.id, newCNode);

      if (labelB.get(t.id) > labelB.get(newCNode.id)) {
        labelB.set(newCNode.id, labelB.get(t.id));

        if (embed) // needed to calculate obstruction edges;
          nodeLabelB.set(newCNode.id, nodeLabelB.get(t.id));
      }
    }
    else {
      //      cout << "Not Is CNode :" << t << endl;
      parent.set(t.id, newCNode);
      updateLabelB(t);

      if (labelB.get(t.id) > dfsPosNum.get(n.id)) {
        BmdLink<node>* item = nodeList.append(t);
        ptrItem.set(t.id, item) ;//nodeList.append(t));
      }

      if (labelB.get(t.id) > labelB.get(newCNode.id)) {
        labelB.set(newCNode.id, labelB.get(t.id));

        if (embed) // needed to calculate obstruction edges;
          nodeLabelB.set(newCNode.id, nodeLabelB.get(t.id));
      }
    }

    if (!isCNode(t))
      predT = t; // predT is never a c-node;

    t = parentT;
  }
}
Пример #2
0
/*
 * Embeds all edges in path P' from t1 to t2 and all back-edges with
 * representant in P' (emb_list).
 * emb_back_edges_out_w is false only in case of 2 terminal
 * nodes, for one of the two terminals (see calculate_partial_embedding).
 * Returns an ordered list of all representants to be embedded later
 * (see add_old_cnode_to_embedding).
 * Precondition:
 * - if u is a node in P' and e is a back-edge with representant u then e is in list
 *   b_edges_repres[u].
 */
list<node> PlanarityTestImpl::embedUpwardT(bool embBackEdgesOutW,
    node t1,
    node t2,
    Graph *sG,
    node w,
    map<node , list<edge> > &bEdgesRepres,
    list<node>& traversedNodes,
    tlp::BmdList<edge>& embList) {
  list<node> toEmbedLater;
  node u = t1, predU = NULL_NODE;

  while (predU != t2) {
    if (isCNode(u)) {
      node f = predU,
           oldCNode = activeCNodeOf(false, u);
      addOldCNodeToEmbedding(embBackEdgesOutW, sG, w, oldCNode, f,
                             bEdgesRepres, traversedNodes, toEmbedLater,
                             embList);
      u = parent.get(oldCNode.id);

      if (u == t2)
        return toEmbedLater;
    }
    else {
      if (predU != NULL_NODE) {

        embList.push(edgeReversal( T0EdgeIn.get(predU.id)));

        if (u != w)
          embList.push(T0EdgeIn.get(predU.id));
        else
          embList.append(T0EdgeIn.get(predU.id));
      }
    }

    if (hasBackEdge.get(u.id) && u != t2)
      embedBackEdges(embBackEdgesOutW, sG, u, traversedNodes,
                     bEdgesRepres[u], embList);

    predU = u;
    u = parent.get(u.id);
  }

  return toEmbedLater;
}