00001
00002
00003
00004
00005
00006
00007
00008
00052 #ifdef _MSC_VER
00053 #pragma once
00054 #endif
00055
00056 #ifndef OGDF_COMBINATORIAL_EMBEDDING_H
00057 #define OGDF_COMBINATORIAL_EMBEDDING_H
00058
00059
00060 #include <ogdf/basic/AdjEntryArray.h>
00061
00062
00063 namespace ogdf {
00064
00065 class ConstCombinatorialEmbedding;
00066
00067 typedef FaceElement *face;
00068
00072 class FaceElement : private GraphElement
00073 {
00074 friend class ConstCombinatorialEmbedding;
00075 friend class CombinatorialEmbedding;
00076 friend class GraphList<FaceElement>;
00077
00078 adjEntry m_adjFirst;
00079 int m_id;
00080 int m_size;
00081
00082 #ifdef OGDF_DEBUG
00083 const ConstCombinatorialEmbedding *m_pEmbedding;
00084 #endif
00085
00086
00087 #ifdef OGDF_DEBUG
00088 FaceElement(const ConstCombinatorialEmbedding *pEmbedding,
00089 adjEntry adjFirst,
00090 int id) :
00091 m_adjFirst(adjFirst), m_id(id), m_size(0), m_pEmbedding(pEmbedding) { }
00092 #else
00094 FaceElement(adjEntry adjFirst, int id) :
00095 m_adjFirst(adjFirst), m_id(id), m_size(0) { }
00096 #endif
00097
00098 public:
00100 int index() const { return m_id; }
00101
00103 adjEntry firstAdj() const { return m_adjFirst; }
00104
00106 int size() const { return m_size; }
00107
00109 face succ() const { return (face)m_next; }
00110
00112 face pred() const { return (face)m_prev; }
00113
00115 adjEntry nextFaceEdge(adjEntry adj) const {
00116 adj = adj->faceCycleSucc();
00117 return (adj != m_adjFirst) ? adj : 0;
00118 }
00119
00120 #ifdef OGDF_DEBUG
00121 const ConstCombinatorialEmbedding *embeddingOf() const { return m_pEmbedding; }
00122 #endif
00123
00124 OGDF_NEW_DELETE
00125 };
00126
00127
00128 class FaceArrayBase;
00129 template<class T>class FaceArray;
00130
00131
00141 class ConstCombinatorialEmbedding
00142 {
00143 protected:
00144 const Graph *m_cpGraph;
00145
00146 GraphList<FaceElement> m_faces;
00147 int m_nFaces;
00148 int m_faceIdCount;
00149 int m_faceArrayTableSize;
00150
00151 AdjEntryArray<face> m_rightFace;
00152 face m_externalFace;
00153
00154 mutable ListPure<FaceArrayBase*> m_regFaceArrays;
00155
00156 public:
00160 ConstCombinatorialEmbedding();
00161
00168 explicit ConstCombinatorialEmbedding(const Graph &G);
00169
00170
00172 ConstCombinatorialEmbedding(const ConstCombinatorialEmbedding &C);
00173
00175 ConstCombinatorialEmbedding &operator=(const ConstCombinatorialEmbedding &C);
00176
00180 const Graph &getGraph() const { return *m_cpGraph; }
00181
00183 operator const Graph &() const { return *m_cpGraph; }
00184
00188 face firstFace() const { return m_faces.begin(); }
00189
00191 face lastFace() const { return m_faces.rbegin(); }
00192
00194 int numberOfFaces() const { return m_nFaces; }
00195
00200 face rightFace(adjEntry adj) const { return m_rightFace[adj]; }
00201
00206 face leftFace(adjEntry adj) const { return m_rightFace[adj->twin()]; }
00207
00211 int maxFaceIndex() const { return m_faceIdCount-1; }
00212
00214 int faceArrayTableSize() const { return m_faceArrayTableSize; }
00215
00219 face chooseFace() const;
00220
00222 face maximalFace() const;
00223
00227 face externalFace() const {
00228 return m_externalFace;
00229 }
00230
00235 void setExternalFace(face f) {
00236 OGDF_ASSERT(f->embeddingOf() == this);
00237 m_externalFace = f;
00238 }
00239
00240 bool isBridge(edge e) const {
00241 return m_rightFace[e->adjSource()] == m_rightFace[e->adjTarget()];
00242 }
00243
00250 void init(const Graph &G);
00251
00253 void computeFaces();
00254
00255
00259 bool consistencyCheck();
00260
00261
00267 ListIterator<FaceArrayBase*> registerArray(FaceArrayBase *pFaceArray) const;
00268
00274 void unregisterArray(ListIterator<FaceArrayBase*> it) const;
00275
00278 protected:
00280 face createFaceElement(adjEntry adjFirst);
00281
00283 void reinitArrays();
00284
00285 };
00286
00287
00288
00295 class CombinatorialEmbedding : public ConstCombinatorialEmbedding
00296 {
00297 Graph *m_pGraph;
00298
00299
00300
00301
00302 CombinatorialEmbedding(const CombinatorialEmbedding &) { }
00303 CombinatorialEmbedding &operator=(const CombinatorialEmbedding &) {
00304 return *this;
00305 }
00306
00307 public:
00311 CombinatorialEmbedding() : ConstCombinatorialEmbedding() {
00312 m_pGraph = 0;
00313 }
00314
00321 explicit CombinatorialEmbedding(Graph &G) : ConstCombinatorialEmbedding(G) {
00322 m_pGraph = &G;
00323 }
00324
00326
00330
00334 const Graph &getGraph() const { return *m_cpGraph; }
00335
00336 Graph &getGraph() { return *m_pGraph; }
00337
00338 operator const Graph &() const { return *m_cpGraph; }
00339
00340 operator Graph &() { return *m_pGraph; }
00341
00342
00344
00348
00355 void init(Graph &G) {
00356 ConstCombinatorialEmbedding::init(G);
00357 m_pGraph = &G;
00358 }
00359
00363 void clear();
00364
00365
00367
00371
00377 edge split(edge e);
00378
00384 void unsplit(edge eIn, edge eOut);
00385
00404 node splitNode(adjEntry adjStartLeft, adjEntry adjStartRight);
00405
00411 node contract(edge e);
00412
00421 edge splitFace(adjEntry adjSrc, adjEntry adjTgt);
00422
00423
00424
00425
00426
00427
00428 edge splitFace(node v, adjEntry adjTgt);
00429 edge splitFace(adjEntry adjSrc, node v);
00430
00436 face joinFaces(edge e);
00437
00439 void reverseEdge(edge e);
00440
00441 void moveBridge(adjEntry adjBridge, adjEntry adjBefore);
00442
00443 void removeDeg1(node v);
00444
00446 void updateMerger(edge e, face fRight, face fLeft);
00447
00448
00451 };
00452
00453
00454
00455
00456
00457
00459 #define forall_faces(f,E) for((f)=(E).firstFace(); (f); (f)=(f)->succ())
00460
00461
00463 #define forall_rev_faces(f,E) for((f)=(E).lastFace(); (f); (f)=(f)->pred())
00464
00477 #define forall_face_adj(adj,f) for((adj)=(f)->firstAdj(); (adj); (adj)=(f)->nextFaceEdge(adj))
00478
00479
00480 }
00481
00482
00483 #endif