SList<node>& DynamicSPQRForest::findPathSPQR (node sH, node tH) const { node vB = bComponent(m_hNode_gNode[sH],m_hNode_gNode[tH]); if (!vB) return *OGDF_NEW SList<node>; if (!m_bNode_SPQR[vB]) { if (m_bNode_hEdges[vB].size()<3) return *OGDF_NEW SList<node>; createSPQR(vB); } node rT; SList<node>& pT = findPathSPQR(sH,tH,rT); if (pT.empty()) if (rT) pT.pushBack(rT); return pT; }
edge v3 = m_H.newEdge(v4->source(),v4->target()); m_hEdge_twinEdge[v1] = v2; m_hEdge_twinEdge[v2] = v1; m_hEdge_twinEdge[v3] = v4; m_hEdge_twinEdge[v4] = v3; m_hEdge_position[v2] = m_tNode_hEdges[nT].pushBack(v2); m_hEdge_position[eH] = m_tNode_hEdges[nT].pushBack(eH); m_hEdge_position[v3] = m_tNode_hEdges[nT].pushBack(v3); m_hEdge_tNode[v2] = m_hEdge_tNode[eH] = m_hEdge_tNode[v3] = nT; m_tNode_hRefEdge[nT] = v3; } return eG; } node rT; SList<node>& pT = findPathSPQR(sH,tH,rT); if (pT.size()<2) { if (m_tNode_type[rT]==RComp) { m_hEdge_position[eH] = m_tNode_hEdges[rT].pushBack(eH); m_hEdge_tNode[eH] = rT; } else { List<edge>& aH = m_tNode_hEdges[rT]; SList<edge> bH; bool a_is_parent = true; ListIterator<edge> iH = aH.begin(); node uH = sH; while (uH!=tH) { node xH = (*iH)->source(); node yH = (*iH)->target(); if (xH==uH) uH = yH;
edge DynamicSPQRTree::updateInsertedEdge(edge eG) { SList<node> marked; node sH = m_gNode_hNode[eG->source()]; node tH = m_gNode_hNode[eG->target()]; for (adjEntry aH : sH->adjEdges) { edge fH = aH->theEdge(); node vT = spqrproper(fH); if (fH->opposite(sH) == tH) { if (m_tNode_type[vT] == PComp) { DynamicSPQRForest::updateInsertedEdge(eG); if (m_sk[vT]) { edge eH = m_gEdge_hEdge[eG]; edge fM = m_skelEdge[fH]; node sM = fM->source(); node tM = fM->target(); if (eH->source() == m_sk[vT]->m_origNode[tM]) { node uM = sM; sM = tM; tM = uM; } m_skelEdge[eH] = m_sk[vT]->getGraph().newEdge(sM, tM); m_sk[vT]->m_origEdge[m_skelEdge[eH]] = eH; } return eG; } else if (!m_hEdge_twinEdge[fH]) { DynamicSPQRForest::updateInsertedEdge(eG); if (m_sk[vT]) { edge gH = m_hEdge_twinEdge[m_tNode_hEdges[m_hEdge_tNode[fH]].front()]; m_skelEdge[gH] = m_skelEdge[fH]; m_sk[vT]->m_origEdge[m_skelEdge[gH]] = gH; } return eG; } else { m_tNode_isMarked[vT] = true; marked.pushBack(vT); } } else { m_tNode_isMarked[vT] = true; marked.pushBack(vT); } } int count = 0; node found[2]; for (adjEntry aH : tH->adjEdges) { edge fH = aH->theEdge(); node vT = spqrproper(fH); if (!m_tNode_isMarked[vT]) continue; found[count++] = vT; m_tNode_isMarked[vT] = false; } while (!marked.empty()) m_tNode_isMarked[marked.popFrontRet()] = false; if (count == 0) { node rT; SList<node>& pT = findPathSPQR(sH, tH, rT); for (node vT : pT) { if (m_sk[vT]) { delete m_sk[vT]; m_sk[vT] = nullptr; } } delete &pT; } else if (count == 1) { node vT = found[0]; if (m_sk[vT]) { delete m_sk[vT]; m_sk[vT] = nullptr; } } return DynamicSPQRForest::updateInsertedEdge(eG); }