コード例 #1
0
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;
}
コード例 #2
0
			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;
コード例 #3
0
ファイル: DynamicSPQRTree.cpp プロジェクト: lncosie/ogdf
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);
}