Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00043 #ifdef _MSC_VER
00044 #pragma once
00045 #endif
00046
00047 #ifndef OGDF_DYNAMIC_SPQR_FOREST_H
00048 #define OGDF_DYNAMIC_SPQR_FOREST_H
00049
00050 #include <ogdf/decomposition/DynamicBCTree.h>
00051 #include <ogdf/decomposition/SPQRTree.h>
00052
00053 namespace ogdf {
00054
00063 class OGDF_EXPORT DynamicSPQRForest : public DynamicBCTree {
00064
00065 public:
00066
00079 enum TNodeType {
00080 SComp = SPQRTree::SNode,
00081 PComp = SPQRTree::PNode,
00082 RComp = SPQRTree::RNode
00083 };
00084
00085 protected:
00086
00090 mutable Graph m_T;
00091
00099 mutable NodeArray<node> m_bNode_SPQR;
00108 mutable NodeArray<int> m_bNode_numS;
00117 mutable NodeArray<int> m_bNode_numP;
00126 mutable NodeArray<int> m_bNode_numR;
00127
00131 mutable NodeArray<TNodeType> m_tNode_type;
00136 mutable NodeArray<node> m_tNode_owner;
00141 mutable NodeArray<edge> m_tNode_hRefEdge;
00146 mutable NodeArray<List<edge> > m_tNode_hEdges;
00147
00152 mutable EdgeArray<ListIterator<edge> > m_hEdge_position;
00157 mutable EdgeArray<node> m_hEdge_tNode;
00161 mutable EdgeArray<edge> m_hEdge_twinEdge;
00162
00166 mutable NodeArray<node> m_htogc;
00170 mutable NodeArray<bool> m_tNode_isMarked;
00171
00175 void init ();
00191 void createSPQR (node vB) const;
00192
00206 node uniteSPQR (node vB, node sT, node tT);
00214 node findSPQR (node vT) const;
00215
00227 node findNCASPQR (node sT, node tT) const;
00241 SList<node>& findPathSPQR (node sH, node tH, node& rT) const;
00242
00256 edge updateInsertedEdgeSPQR (node vB, edge eG);
00270 node updateInsertedNodeSPQR (node vB, edge eG, edge fG);
00271
00272 public:
00273
00283 DynamicSPQRForest (Graph& G) : DynamicBCTree(G) { init(); }
00284
00300 node spqrproper (edge eH) const { return m_hEdge_tNode[eH] = findSPQR(m_hEdge_tNode[eH]); }
00308 edge twinEdge (edge eH) const { return m_hEdge_twinEdge[eH]; }
00309
00320 TNodeType typeOfTNode (node vT) const { return m_tNode_type[vT]; }
00332 const List<edge>& hEdgesSPQR (node vT) const { return m_tNode_hEdges[vT]; }
00345 SList<node>& findPathSPQR (node sH, node tH) const;
00361 edge virtualEdge (node vT, node wT) const;
00362
00376 edge updateInsertedEdge (edge eG);
00391 node updateInsertedNode (edge eG, edge fG);
00392
00395 };
00396
00397 }
00398
00399 #endif