/* * Returns the active c-node of RBC list containing "u". * Traverses only nodes with label_b <= dfspos_num[w]. * Let z be the first element of RBC. * All traversed nodes, but z, are inserted in "nl". * Pre-conditions: * - "u" is not the 1st element in RBC list; * - ptritem[u] is the pointer to the item containing "u"; * - "u" is a node that is an ancestor of a neighbor of w; * - state[v] == NOT_VISITED for each node v in RBC list that was not * traversed. */ node PlanarityTestImpl::findActiveCNode(node u, node w, list<node> &nl) { list<node> traversedNodesInRBC; assert(isCNode(parent.get(u.id))); if (state.get(u.id) != NOT_VISITED) { assert(!isCNode(parent.get(parent.get(u.id).id))); return parent.get(u.id); } BmdLink<node> *it1 = ptrItem.get(u.id); // ptrItem[u]; assert(it1 != nullptr); state.set(u.id, VISITED_IN_RBC); traversedNodesInRBC.push_back(u); BmdLink<node> *it = searchRBC(1, it1, w, traversedNodesInRBC); if (it == nullptr) it = searchRBC(0, it1, w, traversedNodesInRBC); assert(it != nullptr); node v = it->getData(); node cNode; if (it->prev() != nullptr && it->succ() != nullptr) cNode = parent.get(v.id); // path compressed; else cNode = activeCNode[it]; assert(cNode != NULL_NODE); node first = RBC[cNode].firstItem()->getData(); // path compression; // forall(v, traversedNodesInRBC) for (list<node>::iterator it = traversedNodesInRBC.begin(); it != traversedNodesInRBC.end(); ++it) { if (*it != first) { if (*it != u) nl.push_back(v); parent.set((*it).id, cNode); } else state.set((*it).id, NOT_VISITED); } return cNode; }