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
00048 #ifndef OGDF_DYNAMIC_SPQR_TREE_H
00049 #define OGDF_DYNAMIC_SPQR_TREE_H
00050
00051
00052 #include <ogdf/decomposition/SPQRTree.h>
00053 #include <ogdf/decomposition/DynamicSPQRForest.h>
00054 #include <ogdf/decomposition/DynamicSkeleton.h>
00055
00056
00057 namespace ogdf {
00058
00059
00060
00061
00062
00063
00095 class OGDF_EXPORT DynamicSPQRTree : public virtual SPQRTree, public DynamicSPQRForest
00096 {
00097 public:
00098
00099 friend class OGDF_EXPORT DynamicSkeleton;
00100
00101
00102
00103
00109 DynamicSPQRTree (Graph& G) : DynamicSPQRForest(G) { init(G.firstEdge()); }
00110
00116 DynamicSPQRTree (Graph& G, edge e) : DynamicSPQRForest(G) { init(e); }
00117
00118
00119
00120
00121 ~DynamicSPQRTree();
00122
00123
00124
00125
00126
00127
00129 const Graph& originalGraph () const { return m_G; }
00130
00132 const Graph& tree () const { return m_T; }
00133
00135 edge rootEdge () const { return m_rootEdge; }
00136
00138 node rootNode () const { return findSPQR(m_bNode_SPQR[m_B.firstNode()]); }
00139
00141 int numberOfSNodes () const { return m_bNode_numS[m_B.firstNode()]; }
00142
00144 int numberOfPNodes () const { return m_bNode_numP[m_B.firstNode()]; }
00145
00147 int numberOfRNodes () const { return m_bNode_numR[m_B.firstNode()]; }
00148
00153 NodeType typeOf (node v) const
00154 {
00155 return (NodeType)m_tNode_type[findSPQR(v)];
00156 }
00157
00159 List<node> nodesOfType (NodeType t) const;
00160
00162 SList<node>& findPath (node s, node t) { return findPathSPQR(m_gNode_hNode[s],m_gNode_hNode[t]); }
00163
00168 Skeleton& skeleton (node v) const
00169 {
00170 v = findSPQR(v);
00171 if (!m_sk[v]) return createSkeleton(v);
00172 return *m_sk[v];
00173 }
00174
00179 const Skeleton& skeletonOfReal (edge e) const { return skeleton(spqrproper(m_gEdge_hEdge[e])); }
00180
00185 edge copyOfReal (edge e) const
00186 {
00187 e = m_gEdge_hEdge[e];
00188 skeleton(spqrproper(e));
00189 return m_skelEdge[e];
00190 }
00191
00197 edge skeletonEdge (node v, node w) const
00198 {
00199 edge e = virtualEdge(v,w);
00200 if (!e) return e;
00201 skeleton(w);
00202 return m_skelEdge[e];
00203 }
00204
00205
00206
00207
00208
00209
00214 node rootTreeAt (edge e);
00215
00220 node rootTreeAt (node v);
00221
00226 edge updateInsertedEdge (edge e);
00227
00232 node updateInsertedNode (edge e, edge f);
00233
00234
00235 protected:
00236
00238 void init (edge e);
00239
00241 DynamicSkeleton& createSkeleton (node vT) const;
00242
00247 void cpRec (node v, PertinentGraph& Gp) const
00248 {
00249 v = findSPQR(v);
00250 for (ListConstIterator<edge> i=m_tNode_hEdges[v].begin(); i.valid(); ++i) {
00251 edge e = m_hEdge_gEdge[*i];
00252 if (e) cpAddEdge(e,Gp);
00253 else if (*i!=m_tNode_hRefEdge[v]) cpRec(spqrproper(*i),Gp);
00254 }
00255 }
00256
00257
00258 edge m_rootEdge;
00259
00260 mutable NodeArray<DynamicSkeleton*> m_sk;
00261 mutable EdgeArray<edge> m_skelEdge;
00262 mutable NodeArray<node> m_mapV;
00263
00264 };
00265
00266
00267 }
00268
00269
00270 #endif