Open
Graph Drawing
Framework

 v.2012.05
 

DynamicSPQRTree.h
Go to the documentation of this file.
00001 /*
00002  * $Revision: 2299 $
00003  * 
00004  * last checkin:
00005  *   $Author: gutwenger $ 
00006  *   $Date: 2012-05-07 15:57:08 +0200 (Mon, 07 May 2012) $ 
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 // DynamicSPQRTree
00061 // SPQR-tree data structure (dynamic environment)
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     // constructors
00103 
00109     DynamicSPQRTree (Graph& G) : DynamicSPQRForest(G) { init(G.firstEdge()); }
00110 
00116     DynamicSPQRTree (Graph& G, edge e) : DynamicSPQRForest(G) { init(e); }
00117 
00118 
00119     // destructor
00120 
00121     ~DynamicSPQRTree();
00122 
00123 
00124     //
00125     // a) Access operations
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     // b) Update operations
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 }; // class DynamicSPQRTree
00265 
00266 
00267 } // end namespace ogdf
00268 
00269 
00270 #endif