|
1 /* -*- C++ -*- |
|
2 * |
|
3 * This file is a part of LEMON, a generic C++ optimization library |
|
4 * |
|
5 * Copyright (C) 2003-2008 |
|
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
|
7 * (Egervary Research Group on Combinatorial Optimization, EGRES). |
|
8 * |
|
9 * Permission to use, modify and distribute this software is granted |
|
10 * provided that this copyright notice appears in all copies. For |
|
11 * precise terms see the accompanying LICENSE file. |
|
12 * |
|
13 * This software is provided "AS IS" with no warranty of any kind, |
|
14 * express or implied, and with no claim as to its suitability for any |
|
15 * purpose. |
|
16 * |
|
17 */ |
|
18 |
|
19 #ifndef LEMON_GRAPH_ADAPTOR_H |
|
20 #define LEMON_GRAPH_ADAPTOR_H |
|
21 |
|
22 ///\ingroup graph_adaptors |
|
23 ///\file |
|
24 ///\brief Several graph adaptors. |
|
25 /// |
|
26 ///This file contains several useful undirected graph adaptor classes. |
|
27 |
|
28 #include <lemon/core.h> |
|
29 #include <lemon/maps.h> |
|
30 #include <lemon/bits/graph_adaptor_extender.h> |
|
31 |
|
32 namespace lemon { |
|
33 |
|
34 /// \brief Base type for the Graph Adaptors |
|
35 /// |
|
36 /// This is the base type for most of LEMON graph adaptors. |
|
37 /// This class implements a trivial graph adaptor i.e. it only wraps the |
|
38 /// functions and types of the graph. The purpose of this class is to |
|
39 /// make easier implementing graph adaptors. E.g. if an adaptor is |
|
40 /// considered which differs from the wrapped graph only in some of its |
|
41 /// functions or types, then it can be derived from GraphAdaptor, and only |
|
42 /// the differences should be implemented. |
|
43 template<typename _Graph> |
|
44 class GraphAdaptorBase { |
|
45 public: |
|
46 typedef _Graph Graph; |
|
47 typedef Graph ParentGraph; |
|
48 |
|
49 protected: |
|
50 Graph* _graph; |
|
51 |
|
52 GraphAdaptorBase() : _graph(0) {} |
|
53 |
|
54 void setGraph(Graph& graph) { _graph = &graph; } |
|
55 |
|
56 public: |
|
57 GraphAdaptorBase(Graph& graph) : _graph(&graph) {} |
|
58 |
|
59 typedef typename Graph::Node Node; |
|
60 typedef typename Graph::Arc Arc; |
|
61 typedef typename Graph::Edge Edge; |
|
62 |
|
63 void first(Node& i) const { _graph->first(i); } |
|
64 void first(Arc& i) const { _graph->first(i); } |
|
65 void first(Edge& i) const { _graph->first(i); } |
|
66 void firstIn(Arc& i, const Node& n) const { _graph->firstIn(i, n); } |
|
67 void firstOut(Arc& i, const Node& n ) const { _graph->firstOut(i, n); } |
|
68 void firstInc(Edge &i, bool &d, const Node &n) const { |
|
69 _graph->firstInc(i, d, n); |
|
70 } |
|
71 |
|
72 void next(Node& i) const { _graph->next(i); } |
|
73 void next(Arc& i) const { _graph->next(i); } |
|
74 void next(Edge& i) const { _graph->next(i); } |
|
75 void nextIn(Arc& i) const { _graph->nextIn(i); } |
|
76 void nextOut(Arc& i) const { _graph->nextOut(i); } |
|
77 void nextInc(Edge &i, bool &d) const { _graph->nextInc(i, d); } |
|
78 |
|
79 Node u(const Edge& e) const { return _graph->u(e); } |
|
80 Node v(const Edge& e) const { return _graph->v(e); } |
|
81 |
|
82 Node source(const Arc& a) const { return _graph->source(a); } |
|
83 Node target(const Arc& a) const { return _graph->target(a); } |
|
84 |
|
85 typedef NodeNumTagIndicator<Graph> NodeNumTag; |
|
86 int nodeNum() const { return _graph->nodeNum(); } |
|
87 |
|
88 typedef EdgeNumTagIndicator<Graph> EdgeNumTag; |
|
89 int arcNum() const { return _graph->arcNum(); } |
|
90 int edgeNum() const { return _graph->edgeNum(); } |
|
91 |
|
92 typedef FindEdgeTagIndicator<Graph> FindEdgeTag; |
|
93 Arc findArc(const Node& u, const Node& v, const Arc& prev = INVALID) { |
|
94 return _graph->findArc(u, v, prev); |
|
95 } |
|
96 Edge findEdge(const Node& u, const Node& v, const Edge& prev = INVALID) { |
|
97 return _graph->findEdge(u, v, prev); |
|
98 } |
|
99 |
|
100 Node addNode() { return _graph->addNode(); } |
|
101 Edge addEdge(const Node& u, const Node& v) { return _graph->addEdge(u, v); } |
|
102 |
|
103 void erase(const Node& i) { _graph->erase(i); } |
|
104 void erase(const Edge& i) { _graph->erase(i); } |
|
105 |
|
106 void clear() { _graph->clear(); } |
|
107 |
|
108 bool direction(const Arc& a) const { return _graph->direction(a); } |
|
109 Arc direct(const Edge& e, bool d) const { return _graph->direct(e, d); } |
|
110 |
|
111 int id(const Node& v) const { return _graph->id(v); } |
|
112 int id(const Arc& a) const { return _graph->id(a); } |
|
113 int id(const Edge& e) const { return _graph->id(e); } |
|
114 |
|
115 Node nodeFromId(int ix) const { return _graph->nodeFromId(ix); } |
|
116 Arc arcFromId(int ix) const { return _graph->arcFromId(ix); } |
|
117 Edge edgeFromId(int ix) const { return _graph->edgeFromId(ix); } |
|
118 |
|
119 int maxNodeId() const { return _graph->maxNodeId(); } |
|
120 int maxArcId() const { return _graph->maxArcId(); } |
|
121 int maxEdgeId() const { return _graph->maxEdgeId(); } |
|
122 |
|
123 typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier; |
|
124 NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); } |
|
125 |
|
126 typedef typename ItemSetTraits<Graph, Arc>::ItemNotifier ArcNotifier; |
|
127 ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); } |
|
128 |
|
129 typedef typename ItemSetTraits<Graph, Edge>::ItemNotifier EdgeNotifier; |
|
130 EdgeNotifier& notifier(Edge) const { return _graph->notifier(Edge()); } |
|
131 |
|
132 template <typename _Value> |
|
133 class NodeMap : public Graph::template NodeMap<_Value> { |
|
134 public: |
|
135 typedef typename Graph::template NodeMap<_Value> Parent; |
|
136 explicit NodeMap(const GraphAdaptorBase<Graph>& adapter) |
|
137 : Parent(*adapter._graph) {} |
|
138 NodeMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value) |
|
139 : Parent(*adapter._graph, value) {} |
|
140 |
|
141 private: |
|
142 NodeMap& operator=(const NodeMap& cmap) { |
|
143 return operator=<NodeMap>(cmap); |
|
144 } |
|
145 |
|
146 template <typename CMap> |
|
147 NodeMap& operator=(const CMap& cmap) { |
|
148 Parent::operator=(cmap); |
|
149 return *this; |
|
150 } |
|
151 |
|
152 }; |
|
153 |
|
154 template <typename _Value> |
|
155 class ArcMap : public Graph::template ArcMap<_Value> { |
|
156 public: |
|
157 typedef typename Graph::template ArcMap<_Value> Parent; |
|
158 explicit ArcMap(const GraphAdaptorBase<Graph>& adapter) |
|
159 : Parent(*adapter._graph) {} |
|
160 ArcMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value) |
|
161 : Parent(*adapter._graph, value) {} |
|
162 |
|
163 private: |
|
164 ArcMap& operator=(const ArcMap& cmap) { |
|
165 return operator=<ArcMap>(cmap); |
|
166 } |
|
167 |
|
168 template <typename CMap> |
|
169 ArcMap& operator=(const CMap& cmap) { |
|
170 Parent::operator=(cmap); |
|
171 return *this; |
|
172 } |
|
173 }; |
|
174 |
|
175 template <typename _Value> |
|
176 class EdgeMap : public Graph::template EdgeMap<_Value> { |
|
177 public: |
|
178 typedef typename Graph::template EdgeMap<_Value> Parent; |
|
179 explicit EdgeMap(const GraphAdaptorBase<Graph>& adapter) |
|
180 : Parent(*adapter._graph) {} |
|
181 EdgeMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value) |
|
182 : Parent(*adapter._graph, value) {} |
|
183 |
|
184 private: |
|
185 EdgeMap& operator=(const EdgeMap& cmap) { |
|
186 return operator=<EdgeMap>(cmap); |
|
187 } |
|
188 |
|
189 template <typename CMap> |
|
190 EdgeMap& operator=(const CMap& cmap) { |
|
191 Parent::operator=(cmap); |
|
192 return *this; |
|
193 } |
|
194 }; |
|
195 |
|
196 }; |
|
197 |
|
198 /// \ingroup graph_adaptors |
|
199 /// |
|
200 /// \brief Trivial graph adaptor |
|
201 /// |
|
202 /// This class is an adaptor which does not change the adapted undirected |
|
203 /// graph. It can be used only to test the graph adaptors. |
|
204 template <typename _Graph> |
|
205 class GraphAdaptor |
|
206 : public GraphAdaptorExtender< GraphAdaptorBase<_Graph> > { |
|
207 public: |
|
208 typedef _Graph Graph; |
|
209 typedef GraphAdaptorExtender<GraphAdaptorBase<_Graph> > Parent; |
|
210 protected: |
|
211 GraphAdaptor() : Parent() {} |
|
212 |
|
213 public: |
|
214 explicit GraphAdaptor(Graph& graph) { setGraph(graph); } |
|
215 }; |
|
216 |
|
217 template <typename _Graph, typename NodeFilterMap, |
|
218 typename EdgeFilterMap, bool checked = true> |
|
219 class SubGraphAdaptorBase : public GraphAdaptorBase<_Graph> { |
|
220 public: |
|
221 typedef _Graph Graph; |
|
222 typedef SubGraphAdaptorBase Adaptor; |
|
223 typedef GraphAdaptorBase<_Graph> Parent; |
|
224 protected: |
|
225 |
|
226 NodeFilterMap* _node_filter_map; |
|
227 EdgeFilterMap* _edge_filter_map; |
|
228 |
|
229 SubGraphAdaptorBase() |
|
230 : Parent(), _node_filter_map(0), _edge_filter_map(0) { } |
|
231 |
|
232 void setNodeFilterMap(NodeFilterMap& node_filter_map) { |
|
233 _node_filter_map=&node_filter_map; |
|
234 } |
|
235 void setEdgeFilterMap(EdgeFilterMap& edge_filter_map) { |
|
236 _edge_filter_map=&edge_filter_map; |
|
237 } |
|
238 |
|
239 public: |
|
240 |
|
241 typedef typename Parent::Node Node; |
|
242 typedef typename Parent::Arc Arc; |
|
243 typedef typename Parent::Edge Edge; |
|
244 |
|
245 void first(Node& i) const { |
|
246 Parent::first(i); |
|
247 while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i); |
|
248 } |
|
249 |
|
250 void first(Arc& i) const { |
|
251 Parent::first(i); |
|
252 while (i!=INVALID && (!(*_edge_filter_map)[i] |
|
253 || !(*_node_filter_map)[Parent::source(i)] |
|
254 || !(*_node_filter_map)[Parent::target(i)])) Parent::next(i); |
|
255 } |
|
256 |
|
257 void first(Edge& i) const { |
|
258 Parent::first(i); |
|
259 while (i!=INVALID && (!(*_edge_filter_map)[i] |
|
260 || !(*_node_filter_map)[Parent::u(i)] |
|
261 || !(*_node_filter_map)[Parent::v(i)])) Parent::next(i); |
|
262 } |
|
263 |
|
264 void firstIn(Arc& i, const Node& n) const { |
|
265 Parent::firstIn(i, n); |
|
266 while (i!=INVALID && (!(*_edge_filter_map)[i] |
|
267 || !(*_node_filter_map)[Parent::source(i)])) Parent::nextIn(i); |
|
268 } |
|
269 |
|
270 void firstOut(Arc& i, const Node& n) const { |
|
271 Parent::firstOut(i, n); |
|
272 while (i!=INVALID && (!(*_edge_filter_map)[i] |
|
273 || !(*_node_filter_map)[Parent::target(i)])) Parent::nextOut(i); |
|
274 } |
|
275 |
|
276 void firstInc(Edge& i, bool& d, const Node& n) const { |
|
277 Parent::firstInc(i, d, n); |
|
278 while (i!=INVALID && (!(*_edge_filter_map)[i] |
|
279 || !(*_node_filter_map)[Parent::u(i)] |
|
280 || !(*_node_filter_map)[Parent::v(i)])) Parent::nextInc(i, d); |
|
281 } |
|
282 |
|
283 void next(Node& i) const { |
|
284 Parent::next(i); |
|
285 while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i); |
|
286 } |
|
287 |
|
288 void next(Arc& i) const { |
|
289 Parent::next(i); |
|
290 while (i!=INVALID && (!(*_edge_filter_map)[i] |
|
291 || !(*_node_filter_map)[Parent::source(i)] |
|
292 || !(*_node_filter_map)[Parent::target(i)])) Parent::next(i); |
|
293 } |
|
294 |
|
295 void next(Edge& i) const { |
|
296 Parent::next(i); |
|
297 while (i!=INVALID && (!(*_edge_filter_map)[i] |
|
298 || !(*_node_filter_map)[Parent::u(i)] |
|
299 || !(*_node_filter_map)[Parent::v(i)])) Parent::next(i); |
|
300 } |
|
301 |
|
302 void nextIn(Arc& i) const { |
|
303 Parent::nextIn(i); |
|
304 while (i!=INVALID && (!(*_edge_filter_map)[i] |
|
305 || !(*_node_filter_map)[Parent::source(i)])) Parent::nextIn(i); |
|
306 } |
|
307 |
|
308 void nextOut(Arc& i) const { |
|
309 Parent::nextOut(i); |
|
310 while (i!=INVALID && (!(*_edge_filter_map)[i] |
|
311 || !(*_node_filter_map)[Parent::target(i)])) Parent::nextOut(i); |
|
312 } |
|
313 |
|
314 void nextInc(Edge& i, bool& d) const { |
|
315 Parent::nextInc(i, d); |
|
316 while (i!=INVALID && (!(*_edge_filter_map)[i] |
|
317 || !(*_node_filter_map)[Parent::u(i)] |
|
318 || !(*_node_filter_map)[Parent::v(i)])) Parent::nextInc(i, d); |
|
319 } |
|
320 |
|
321 /// \brief Hide the given node in the graph. |
|
322 /// |
|
323 /// This function hides \c n in the graph, i.e. the iteration |
|
324 /// jumps over it. This is done by simply setting the value of \c n |
|
325 /// to be false in the corresponding node-map. |
|
326 void hide(const Node& n) const { _node_filter_map->set(n, false); } |
|
327 |
|
328 /// \brief Hide the given edge in the graph. |
|
329 /// |
|
330 /// This function hides \c e in the graph, i.e. the iteration |
|
331 /// jumps over it. This is done by simply setting the value of \c e |
|
332 /// to be false in the corresponding edge-map. |
|
333 void hide(const Edge& e) const { _edge_filter_map->set(e, false); } |
|
334 |
|
335 /// \brief Unhide the given node in the graph. |
|
336 /// |
|
337 /// The value of \c n is set to be true in the node-map which stores |
|
338 /// hide information. If \c n was hidden previuosly, then it is shown |
|
339 /// again |
|
340 void unHide(const Node& n) const { _node_filter_map->set(n, true); } |
|
341 |
|
342 /// \brief Hide the given edge in the graph. |
|
343 /// |
|
344 /// The value of \c e is set to be true in the edge-map which stores |
|
345 /// hide information. If \c e was hidden previuosly, then it is shown |
|
346 /// again |
|
347 void unHide(const Edge& e) const { _edge_filter_map->set(e, true); } |
|
348 |
|
349 /// \brief Returns true if \c n is hidden. |
|
350 /// |
|
351 /// Returns true if \c n is hidden. |
|
352 bool hidden(const Node& n) const { return !(*_node_filter_map)[n]; } |
|
353 |
|
354 /// \brief Returns true if \c e is hidden. |
|
355 /// |
|
356 /// Returns true if \c e is hidden. |
|
357 bool hidden(const Edge& e) const { return !(*_edge_filter_map)[e]; } |
|
358 |
|
359 typedef False NodeNumTag; |
|
360 typedef False EdgeNumTag; |
|
361 |
|
362 typedef FindEdgeTagIndicator<Graph> FindEdgeTag; |
|
363 Arc findArc(const Node& u, const Node& v, |
|
364 const Arc& prev = INVALID) { |
|
365 if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) { |
|
366 return INVALID; |
|
367 } |
|
368 Arc arc = Parent::findArc(u, v, prev); |
|
369 while (arc != INVALID && !(*_edge_filter_map)[arc]) { |
|
370 arc = Parent::findArc(u, v, arc); |
|
371 } |
|
372 return arc; |
|
373 } |
|
374 Edge findEdge(const Node& u, const Node& v, |
|
375 const Edge& prev = INVALID) { |
|
376 if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) { |
|
377 return INVALID; |
|
378 } |
|
379 Edge edge = Parent::findEdge(u, v, prev); |
|
380 while (edge != INVALID && !(*_edge_filter_map)[edge]) { |
|
381 edge = Parent::findEdge(u, v, edge); |
|
382 } |
|
383 return edge; |
|
384 } |
|
385 |
|
386 template <typename _Value> |
|
387 class NodeMap : public SubMapExtender<Adaptor, |
|
388 typename Parent::template NodeMap<_Value> > { |
|
389 public: |
|
390 typedef _Value Value; |
|
391 typedef SubMapExtender<Adaptor, typename Parent:: |
|
392 template NodeMap<Value> > MapParent; |
|
393 |
|
394 NodeMap(const Adaptor& adaptor) |
|
395 : MapParent(adaptor) {} |
|
396 NodeMap(const Adaptor& adaptor, const Value& value) |
|
397 : MapParent(adaptor, value) {} |
|
398 |
|
399 private: |
|
400 NodeMap& operator=(const NodeMap& cmap) { |
|
401 return operator=<NodeMap>(cmap); |
|
402 } |
|
403 |
|
404 template <typename CMap> |
|
405 NodeMap& operator=(const CMap& cmap) { |
|
406 MapParent::operator=(cmap); |
|
407 return *this; |
|
408 } |
|
409 }; |
|
410 |
|
411 template <typename _Value> |
|
412 class ArcMap : public SubMapExtender<Adaptor, |
|
413 typename Parent::template ArcMap<_Value> > { |
|
414 public: |
|
415 typedef _Value Value; |
|
416 typedef SubMapExtender<Adaptor, typename Parent:: |
|
417 template ArcMap<Value> > MapParent; |
|
418 |
|
419 ArcMap(const Adaptor& adaptor) |
|
420 : MapParent(adaptor) {} |
|
421 ArcMap(const Adaptor& adaptor, const Value& value) |
|
422 : MapParent(adaptor, value) {} |
|
423 |
|
424 private: |
|
425 ArcMap& operator=(const ArcMap& cmap) { |
|
426 return operator=<ArcMap>(cmap); |
|
427 } |
|
428 |
|
429 template <typename CMap> |
|
430 ArcMap& operator=(const CMap& cmap) { |
|
431 MapParent::operator=(cmap); |
|
432 return *this; |
|
433 } |
|
434 }; |
|
435 |
|
436 template <typename _Value> |
|
437 class EdgeMap : public SubMapExtender<Adaptor, |
|
438 typename Parent::template EdgeMap<_Value> > { |
|
439 public: |
|
440 typedef _Value Value; |
|
441 typedef SubMapExtender<Adaptor, typename Parent:: |
|
442 template EdgeMap<Value> > MapParent; |
|
443 |
|
444 EdgeMap(const Adaptor& adaptor) |
|
445 : MapParent(adaptor) {} |
|
446 |
|
447 EdgeMap(const Adaptor& adaptor, const Value& value) |
|
448 : MapParent(adaptor, value) {} |
|
449 |
|
450 private: |
|
451 EdgeMap& operator=(const EdgeMap& cmap) { |
|
452 return operator=<EdgeMap>(cmap); |
|
453 } |
|
454 |
|
455 template <typename CMap> |
|
456 EdgeMap& operator=(const CMap& cmap) { |
|
457 MapParent::operator=(cmap); |
|
458 return *this; |
|
459 } |
|
460 }; |
|
461 |
|
462 }; |
|
463 |
|
464 template <typename _Graph, typename NodeFilterMap, typename EdgeFilterMap> |
|
465 class SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap, false> |
|
466 : public GraphAdaptorBase<_Graph> { |
|
467 public: |
|
468 typedef _Graph Graph; |
|
469 typedef SubGraphAdaptorBase Adaptor; |
|
470 typedef GraphAdaptorBase<_Graph> Parent; |
|
471 protected: |
|
472 NodeFilterMap* _node_filter_map; |
|
473 EdgeFilterMap* _edge_filter_map; |
|
474 SubGraphAdaptorBase() : Parent(), |
|
475 _node_filter_map(0), _edge_filter_map(0) { } |
|
476 |
|
477 void setNodeFilterMap(NodeFilterMap& node_filter_map) { |
|
478 _node_filter_map=&node_filter_map; |
|
479 } |
|
480 void setEdgeFilterMap(EdgeFilterMap& edge_filter_map) { |
|
481 _edge_filter_map=&edge_filter_map; |
|
482 } |
|
483 |
|
484 public: |
|
485 |
|
486 typedef typename Parent::Node Node; |
|
487 typedef typename Parent::Arc Arc; |
|
488 typedef typename Parent::Edge Edge; |
|
489 |
|
490 void first(Node& i) const { |
|
491 Parent::first(i); |
|
492 while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i); |
|
493 } |
|
494 |
|
495 void first(Arc& i) const { |
|
496 Parent::first(i); |
|
497 while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i); |
|
498 } |
|
499 |
|
500 void first(Edge& i) const { |
|
501 Parent::first(i); |
|
502 while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i); |
|
503 } |
|
504 |
|
505 void firstIn(Arc& i, const Node& n) const { |
|
506 Parent::firstIn(i, n); |
|
507 while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextIn(i); |
|
508 } |
|
509 |
|
510 void firstOut(Arc& i, const Node& n) const { |
|
511 Parent::firstOut(i, n); |
|
512 while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextOut(i); |
|
513 } |
|
514 |
|
515 void firstInc(Edge& i, bool& d, const Node& n) const { |
|
516 Parent::firstInc(i, d, n); |
|
517 while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d); |
|
518 } |
|
519 |
|
520 void next(Node& i) const { |
|
521 Parent::next(i); |
|
522 while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i); |
|
523 } |
|
524 void next(Arc& i) const { |
|
525 Parent::next(i); |
|
526 while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i); |
|
527 } |
|
528 void next(Edge& i) const { |
|
529 Parent::next(i); |
|
530 while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i); |
|
531 } |
|
532 void nextIn(Arc& i) const { |
|
533 Parent::nextIn(i); |
|
534 while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextIn(i); |
|
535 } |
|
536 |
|
537 void nextOut(Arc& i) const { |
|
538 Parent::nextOut(i); |
|
539 while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextOut(i); |
|
540 } |
|
541 void nextInc(Edge& i, bool& d) const { |
|
542 Parent::nextInc(i, d); |
|
543 while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d); |
|
544 } |
|
545 |
|
546 /// \brief Hide the given node in the graph. |
|
547 /// |
|
548 /// This function hides \c n in the graph, i.e. the iteration |
|
549 /// jumps over it. This is done by simply setting the value of \c n |
|
550 /// to be false in the corresponding node-map. |
|
551 void hide(const Node& n) const { _node_filter_map->set(n, false); } |
|
552 |
|
553 /// \brief Hide the given edge in the graph. |
|
554 /// |
|
555 /// This function hides \c e in the graph, i.e. the iteration |
|
556 /// jumps over it. This is done by simply setting the value of \c e |
|
557 /// to be false in the corresponding edge-map. |
|
558 void hide(const Edge& e) const { _edge_filter_map->set(e, false); } |
|
559 |
|
560 /// \brief Unhide the given node in the graph. |
|
561 /// |
|
562 /// The value of \c n is set to be true in the node-map which stores |
|
563 /// hide information. If \c n was hidden previuosly, then it is shown |
|
564 /// again |
|
565 void unHide(const Node& n) const { _node_filter_map->set(n, true); } |
|
566 |
|
567 /// \brief Hide the given edge in the graph. |
|
568 /// |
|
569 /// The value of \c e is set to be true in the edge-map which stores |
|
570 /// hide information. If \c e was hidden previuosly, then it is shown |
|
571 /// again |
|
572 void unHide(const Edge& e) const { _edge_filter_map->set(e, true); } |
|
573 |
|
574 /// \brief Returns true if \c n is hidden. |
|
575 /// |
|
576 /// Returns true if \c n is hidden. |
|
577 bool hidden(const Node& n) const { return !(*_node_filter_map)[n]; } |
|
578 |
|
579 /// \brief Returns true if \c e is hidden. |
|
580 /// |
|
581 /// Returns true if \c e is hidden. |
|
582 bool hidden(const Edge& e) const { return !(*_edge_filter_map)[e]; } |
|
583 |
|
584 typedef False NodeNumTag; |
|
585 typedef False EdgeNumTag; |
|
586 |
|
587 typedef FindEdgeTagIndicator<Graph> FindEdgeTag; |
|
588 Arc findArc(const Node& u, const Node& v, |
|
589 const Arc& prev = INVALID) { |
|
590 Arc arc = Parent::findArc(u, v, prev); |
|
591 while (arc != INVALID && !(*_edge_filter_map)[arc]) { |
|
592 arc = Parent::findArc(u, v, arc); |
|
593 } |
|
594 return arc; |
|
595 } |
|
596 Edge findEdge(const Node& u, const Node& v, |
|
597 const Edge& prev = INVALID) { |
|
598 Edge edge = Parent::findEdge(u, v, prev); |
|
599 while (edge != INVALID && !(*_edge_filter_map)[edge]) { |
|
600 edge = Parent::findEdge(u, v, edge); |
|
601 } |
|
602 return edge; |
|
603 } |
|
604 |
|
605 template <typename _Value> |
|
606 class NodeMap : public SubMapExtender<Adaptor, |
|
607 typename Parent::template NodeMap<_Value> > { |
|
608 public: |
|
609 typedef _Value Value; |
|
610 typedef SubMapExtender<Adaptor, typename Parent:: |
|
611 template NodeMap<Value> > MapParent; |
|
612 |
|
613 NodeMap(const Adaptor& adaptor) |
|
614 : MapParent(adaptor) {} |
|
615 NodeMap(const Adaptor& adaptor, const Value& value) |
|
616 : MapParent(adaptor, value) {} |
|
617 |
|
618 private: |
|
619 NodeMap& operator=(const NodeMap& cmap) { |
|
620 return operator=<NodeMap>(cmap); |
|
621 } |
|
622 |
|
623 template <typename CMap> |
|
624 NodeMap& operator=(const CMap& cmap) { |
|
625 MapParent::operator=(cmap); |
|
626 return *this; |
|
627 } |
|
628 }; |
|
629 |
|
630 template <typename _Value> |
|
631 class ArcMap : public SubMapExtender<Adaptor, |
|
632 typename Parent::template ArcMap<_Value> > { |
|
633 public: |
|
634 typedef _Value Value; |
|
635 typedef SubMapExtender<Adaptor, typename Parent:: |
|
636 template ArcMap<Value> > MapParent; |
|
637 |
|
638 ArcMap(const Adaptor& adaptor) |
|
639 : MapParent(adaptor) {} |
|
640 ArcMap(const Adaptor& adaptor, const Value& value) |
|
641 : MapParent(adaptor, value) {} |
|
642 |
|
643 private: |
|
644 ArcMap& operator=(const ArcMap& cmap) { |
|
645 return operator=<ArcMap>(cmap); |
|
646 } |
|
647 |
|
648 template <typename CMap> |
|
649 ArcMap& operator=(const CMap& cmap) { |
|
650 MapParent::operator=(cmap); |
|
651 return *this; |
|
652 } |
|
653 }; |
|
654 |
|
655 template <typename _Value> |
|
656 class EdgeMap : public SubMapExtender<Adaptor, |
|
657 typename Parent::template EdgeMap<_Value> > { |
|
658 public: |
|
659 typedef _Value Value; |
|
660 typedef SubMapExtender<Adaptor, typename Parent:: |
|
661 template EdgeMap<Value> > MapParent; |
|
662 |
|
663 EdgeMap(const Adaptor& adaptor) |
|
664 : MapParent(adaptor) {} |
|
665 |
|
666 EdgeMap(const Adaptor& adaptor, const _Value& value) |
|
667 : MapParent(adaptor, value) {} |
|
668 |
|
669 private: |
|
670 EdgeMap& operator=(const EdgeMap& cmap) { |
|
671 return operator=<EdgeMap>(cmap); |
|
672 } |
|
673 |
|
674 template <typename CMap> |
|
675 EdgeMap& operator=(const CMap& cmap) { |
|
676 MapParent::operator=(cmap); |
|
677 return *this; |
|
678 } |
|
679 }; |
|
680 |
|
681 }; |
|
682 |
|
683 /// \ingroup graph_adaptors |
|
684 /// |
|
685 /// \brief A graph adaptor for hiding nodes and arcs from an |
|
686 /// undirected graph. |
|
687 /// |
|
688 /// SubGraphAdaptor shows the graph with filtered node-set and |
|
689 /// edge-set. If the \c checked parameter is true then it filters |
|
690 /// the edge-set to do not get invalid edges which incident node is |
|
691 /// filtered. |
|
692 /// |
|
693 /// If the \c checked template parameter is false then we have to |
|
694 /// note that the node-iterator cares only the filter on the |
|
695 /// node-set, and the edge-iterator cares only the filter on the |
|
696 /// edge-set. This way the edge-map should filter all arcs which |
|
697 /// has filtered end node. |
|
698 template<typename _Graph, typename NodeFilterMap, |
|
699 typename EdgeFilterMap, bool checked = true> |
|
700 class SubGraphAdaptor : |
|
701 public GraphAdaptorExtender< |
|
702 SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap, checked> > { |
|
703 public: |
|
704 typedef _Graph Graph; |
|
705 typedef GraphAdaptorExtender< |
|
706 SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap> > Parent; |
|
707 protected: |
|
708 SubGraphAdaptor() { } |
|
709 public: |
|
710 SubGraphAdaptor(Graph& _graph, NodeFilterMap& node_filter_map, |
|
711 EdgeFilterMap& edge_filter_map) { |
|
712 setGraph(_graph); |
|
713 setNodeFilterMap(node_filter_map); |
|
714 setEdgeFilterMap(edge_filter_map); |
|
715 } |
|
716 }; |
|
717 |
|
718 template<typename Graph, typename NodeFilterMap, typename ArcFilterMap> |
|
719 SubGraphAdaptor<const Graph, NodeFilterMap, ArcFilterMap> |
|
720 subGraphAdaptor(const Graph& graph, |
|
721 NodeFilterMap& nfm, ArcFilterMap& efm) { |
|
722 return SubGraphAdaptor<const Graph, NodeFilterMap, ArcFilterMap> |
|
723 (graph, nfm, efm); |
|
724 } |
|
725 |
|
726 template<typename Graph, typename NodeFilterMap, typename ArcFilterMap> |
|
727 SubGraphAdaptor<const Graph, const NodeFilterMap, ArcFilterMap> |
|
728 subGraphAdaptor(const Graph& graph, |
|
729 NodeFilterMap& nfm, ArcFilterMap& efm) { |
|
730 return SubGraphAdaptor<const Graph, const NodeFilterMap, ArcFilterMap> |
|
731 (graph, nfm, efm); |
|
732 } |
|
733 |
|
734 template<typename Graph, typename NodeFilterMap, typename ArcFilterMap> |
|
735 SubGraphAdaptor<const Graph, NodeFilterMap, const ArcFilterMap> |
|
736 subGraphAdaptor(const Graph& graph, |
|
737 NodeFilterMap& nfm, ArcFilterMap& efm) { |
|
738 return SubGraphAdaptor<const Graph, NodeFilterMap, const ArcFilterMap> |
|
739 (graph, nfm, efm); |
|
740 } |
|
741 |
|
742 template<typename Graph, typename NodeFilterMap, typename ArcFilterMap> |
|
743 SubGraphAdaptor<const Graph, const NodeFilterMap, const ArcFilterMap> |
|
744 subGraphAdaptor(const Graph& graph, |
|
745 NodeFilterMap& nfm, ArcFilterMap& efm) { |
|
746 return SubGraphAdaptor<const Graph, const NodeFilterMap, |
|
747 const ArcFilterMap>(graph, nfm, efm); |
|
748 } |
|
749 |
|
750 /// \ingroup graph_adaptors |
|
751 /// |
|
752 /// \brief An adaptor for hiding nodes from an graph. |
|
753 /// |
|
754 /// An adaptor for hiding nodes from an graph. This |
|
755 /// adaptor specializes SubGraphAdaptor in the way that only the |
|
756 /// node-set can be filtered. In usual case the checked parameter is |
|
757 /// true, we get the induced subgraph. But if the checked parameter |
|
758 /// is false then we can filter only isolated nodes. |
|
759 template<typename _Graph, typename _NodeFilterMap, bool checked = true> |
|
760 class NodeSubGraphAdaptor : |
|
761 public SubGraphAdaptor<_Graph, _NodeFilterMap, |
|
762 ConstMap<typename _Graph::Edge, bool>, checked> { |
|
763 public: |
|
764 typedef _Graph Graph; |
|
765 typedef _NodeFilterMap NodeFilterMap; |
|
766 typedef SubGraphAdaptor<Graph, NodeFilterMap, |
|
767 ConstMap<typename Graph::Edge, bool> > Parent; |
|
768 protected: |
|
769 ConstMap<typename Graph::Edge, bool> const_true_map; |
|
770 |
|
771 NodeSubGraphAdaptor() : const_true_map(true) { |
|
772 Parent::setEdgeFilterMap(const_true_map); |
|
773 } |
|
774 |
|
775 public: |
|
776 NodeSubGraphAdaptor(Graph& _graph, NodeFilterMap& node_filter_map) : |
|
777 Parent(), const_true_map(true) { |
|
778 Parent::setGraph(_graph); |
|
779 Parent::setNodeFilterMap(node_filter_map); |
|
780 Parent::setEdgeFilterMap(const_true_map); |
|
781 } |
|
782 }; |
|
783 |
|
784 template<typename Graph, typename NodeFilterMap> |
|
785 NodeSubGraphAdaptor<const Graph, NodeFilterMap> |
|
786 nodeSubGraphAdaptor(const Graph& graph, NodeFilterMap& nfm) { |
|
787 return NodeSubGraphAdaptor<const Graph, NodeFilterMap>(graph, nfm); |
|
788 } |
|
789 |
|
790 template<typename Graph, typename NodeFilterMap> |
|
791 NodeSubGraphAdaptor<const Graph, const NodeFilterMap> |
|
792 nodeSubGraphAdaptor(const Graph& graph, const NodeFilterMap& nfm) { |
|
793 return NodeSubGraphAdaptor<const Graph, const NodeFilterMap>(graph, nfm); |
|
794 } |
|
795 |
|
796 /// \ingroup graph_adaptors |
|
797 /// |
|
798 /// \brief An adaptor for hiding edges from an graph. |
|
799 /// |
|
800 /// \warning Graph adaptors are in even more experimental state |
|
801 /// than the other parts of the lib. Use them at you own risk. |
|
802 /// |
|
803 /// An adaptor for hiding edges from an graph. |
|
804 /// This adaptor specializes SubGraphAdaptor in the way that |
|
805 /// only the arc-set |
|
806 /// can be filtered. |
|
807 template<typename _Graph, typename _EdgeFilterMap> |
|
808 class EdgeSubGraphAdaptor : |
|
809 public SubGraphAdaptor<_Graph, ConstMap<typename _Graph::Node,bool>, |
|
810 _EdgeFilterMap, false> { |
|
811 public: |
|
812 typedef _Graph Graph; |
|
813 typedef _EdgeFilterMap EdgeFilterMap; |
|
814 typedef SubGraphAdaptor<Graph, ConstMap<typename Graph::Node,bool>, |
|
815 EdgeFilterMap, false> Parent; |
|
816 protected: |
|
817 ConstMap<typename Graph::Node, bool> const_true_map; |
|
818 |
|
819 EdgeSubGraphAdaptor() : const_true_map(true) { |
|
820 Parent::setNodeFilterMap(const_true_map); |
|
821 } |
|
822 |
|
823 public: |
|
824 |
|
825 EdgeSubGraphAdaptor(Graph& _graph, EdgeFilterMap& edge_filter_map) : |
|
826 Parent(), const_true_map(true) { |
|
827 Parent::setGraph(_graph); |
|
828 Parent::setNodeFilterMap(const_true_map); |
|
829 Parent::setEdgeFilterMap(edge_filter_map); |
|
830 } |
|
831 |
|
832 }; |
|
833 |
|
834 template<typename Graph, typename EdgeFilterMap> |
|
835 EdgeSubGraphAdaptor<const Graph, EdgeFilterMap> |
|
836 edgeSubGraphAdaptor(const Graph& graph, EdgeFilterMap& efm) { |
|
837 return EdgeSubGraphAdaptor<const Graph, EdgeFilterMap>(graph, efm); |
|
838 } |
|
839 |
|
840 template<typename Graph, typename EdgeFilterMap> |
|
841 EdgeSubGraphAdaptor<const Graph, const EdgeFilterMap> |
|
842 edgeSubGraphAdaptor(const Graph& graph, const EdgeFilterMap& efm) { |
|
843 return EdgeSubGraphAdaptor<const Graph, const EdgeFilterMap>(graph, efm); |
|
844 } |
|
845 |
|
846 /// \brief Base of direct graph adaptor |
|
847 /// |
|
848 /// Base class of the direct graph adaptor. All public member |
|
849 /// of this class can be used with the DirGraphAdaptor too. |
|
850 /// \sa DirGraphAdaptor |
|
851 template <typename _Graph, typename _DirectionMap> |
|
852 class DirGraphAdaptorBase { |
|
853 public: |
|
854 |
|
855 typedef _Graph Graph; |
|
856 typedef _DirectionMap DirectionMap; |
|
857 |
|
858 typedef typename Graph::Node Node; |
|
859 typedef typename Graph::Edge Arc; |
|
860 |
|
861 /// \brief Reverse arc |
|
862 /// |
|
863 /// It reverse the given arc. It simply negate the direction in the map. |
|
864 void reverseArc(const Arc& arc) { |
|
865 _direction->set(arc, !(*_direction)[arc]); |
|
866 } |
|
867 |
|
868 void first(Node& i) const { _graph->first(i); } |
|
869 void first(Arc& i) const { _graph->first(i); } |
|
870 void firstIn(Arc& i, const Node& n) const { |
|
871 bool d; |
|
872 _graph->firstInc(i, d, n); |
|
873 while (i != INVALID && d == (*_direction)[i]) _graph->nextInc(i, d); |
|
874 } |
|
875 void firstOut(Arc& i, const Node& n ) const { |
|
876 bool d; |
|
877 _graph->firstInc(i, d, n); |
|
878 while (i != INVALID && d != (*_direction)[i]) _graph->nextInc(i, d); |
|
879 } |
|
880 |
|
881 void next(Node& i) const { _graph->next(i); } |
|
882 void next(Arc& i) const { _graph->next(i); } |
|
883 void nextIn(Arc& i) const { |
|
884 bool d = !(*_direction)[i]; |
|
885 _graph->nextInc(i, d); |
|
886 while (i != INVALID && d == (*_direction)[i]) _graph->nextInc(i, d); |
|
887 } |
|
888 void nextOut(Arc& i) const { |
|
889 bool d = (*_direction)[i]; |
|
890 _graph->nextInc(i, d); |
|
891 while (i != INVALID && d != (*_direction)[i]) _graph->nextInc(i, d); |
|
892 } |
|
893 |
|
894 Node source(const Arc& e) const { |
|
895 return (*_direction)[e] ? _graph->u(e) : _graph->v(e); |
|
896 } |
|
897 Node target(const Arc& e) const { |
|
898 return (*_direction)[e] ? _graph->v(e) : _graph->u(e); |
|
899 } |
|
900 |
|
901 typedef NodeNumTagIndicator<Graph> NodeNumTag; |
|
902 int nodeNum() const { return _graph->nodeNum(); } |
|
903 |
|
904 typedef EdgeNumTagIndicator<Graph> EdgeNumTag; |
|
905 int arcNum() const { return _graph->edgeNum(); } |
|
906 |
|
907 typedef FindEdgeTagIndicator<Graph> FindEdgeTag; |
|
908 Arc findArc(const Node& u, const Node& v, |
|
909 const Arc& prev = INVALID) { |
|
910 Arc arc = prev; |
|
911 bool d = arc == INVALID ? true : (*_direction)[arc]; |
|
912 if (d) { |
|
913 arc = _graph->findEdge(u, v, arc); |
|
914 while (arc != INVALID && !(*_direction)[arc]) { |
|
915 _graph->findEdge(u, v, arc); |
|
916 } |
|
917 if (arc != INVALID) return arc; |
|
918 } |
|
919 _graph->findEdge(v, u, arc); |
|
920 while (arc != INVALID && (*_direction)[arc]) { |
|
921 _graph->findEdge(u, v, arc); |
|
922 } |
|
923 return arc; |
|
924 } |
|
925 |
|
926 Node addNode() { |
|
927 return Node(_graph->addNode()); |
|
928 } |
|
929 |
|
930 Arc addArc(const Node& u, const Node& v) { |
|
931 Arc arc = _graph->addArc(u, v); |
|
932 _direction->set(arc, _graph->source(arc) == u); |
|
933 return arc; |
|
934 } |
|
935 |
|
936 void erase(const Node& i) { _graph->erase(i); } |
|
937 void erase(const Arc& i) { _graph->erase(i); } |
|
938 |
|
939 void clear() { _graph->clear(); } |
|
940 |
|
941 int id(const Node& v) const { return _graph->id(v); } |
|
942 int id(const Arc& e) const { return _graph->id(e); } |
|
943 |
|
944 Node nodeFromId(int idx) const { return _graph->nodeFromId(idx); } |
|
945 Arc arcFromId(int idx) const { return _graph->edgeFromId(idx); } |
|
946 |
|
947 int maxNodeId() const { return _graph->maxNodeId(); } |
|
948 int maxArcId() const { return _graph->maxEdgeId(); } |
|
949 |
|
950 typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier; |
|
951 NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); } |
|
952 |
|
953 typedef typename ItemSetTraits<Graph, Arc>::ItemNotifier ArcNotifier; |
|
954 ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); } |
|
955 |
|
956 template <typename _Value> |
|
957 class NodeMap : public _Graph::template NodeMap<_Value> { |
|
958 public: |
|
959 |
|
960 typedef typename _Graph::template NodeMap<_Value> Parent; |
|
961 |
|
962 explicit NodeMap(const DirGraphAdaptorBase& adapter) |
|
963 : Parent(*adapter._graph) {} |
|
964 |
|
965 NodeMap(const DirGraphAdaptorBase& adapter, const _Value& value) |
|
966 : Parent(*adapter._graph, value) {} |
|
967 |
|
968 private: |
|
969 NodeMap& operator=(const NodeMap& cmap) { |
|
970 return operator=<NodeMap>(cmap); |
|
971 } |
|
972 |
|
973 template <typename CMap> |
|
974 NodeMap& operator=(const CMap& cmap) { |
|
975 Parent::operator=(cmap); |
|
976 return *this; |
|
977 } |
|
978 |
|
979 }; |
|
980 |
|
981 template <typename _Value> |
|
982 class ArcMap : public _Graph::template EdgeMap<_Value> { |
|
983 public: |
|
984 |
|
985 typedef typename Graph::template EdgeMap<_Value> Parent; |
|
986 |
|
987 explicit ArcMap(const DirGraphAdaptorBase& adapter) |
|
988 : Parent(*adapter._graph) { } |
|
989 |
|
990 ArcMap(const DirGraphAdaptorBase& adapter, const _Value& value) |
|
991 : Parent(*adapter._graph, value) { } |
|
992 |
|
993 private: |
|
994 ArcMap& operator=(const ArcMap& cmap) { |
|
995 return operator=<ArcMap>(cmap); |
|
996 } |
|
997 |
|
998 template <typename CMap> |
|
999 ArcMap& operator=(const CMap& cmap) { |
|
1000 Parent::operator=(cmap); |
|
1001 return *this; |
|
1002 } |
|
1003 }; |
|
1004 |
|
1005 |
|
1006 |
|
1007 protected: |
|
1008 Graph* _graph; |
|
1009 DirectionMap* _direction; |
|
1010 |
|
1011 void setDirectionMap(DirectionMap& direction) { |
|
1012 _direction = &direction; |
|
1013 } |
|
1014 |
|
1015 void setGraph(Graph& graph) { |
|
1016 _graph = &graph; |
|
1017 } |
|
1018 |
|
1019 }; |
|
1020 |
|
1021 |
|
1022 /// \ingroup graph_adaptors |
|
1023 /// |
|
1024 /// \brief A directed graph is made from an graph by an adaptor |
|
1025 /// |
|
1026 /// This adaptor gives a direction for each edge in the undirected |
|
1027 /// graph. The direction of the arcs stored in the |
|
1028 /// DirectionMap. This map is a bool map on the edges. If |
|
1029 /// the edge is mapped to true then the direction of the directed |
|
1030 /// arc will be the same as the default direction of the edge. The |
|
1031 /// arcs can be easily reverted by the \ref |
|
1032 /// DirGraphAdaptorBase::reverseArc "reverseArc()" member in the |
|
1033 /// adaptor. |
|
1034 /// |
|
1035 /// It can be used to solve orientation problems on directed graphs. |
|
1036 /// For example how can we orient an graph to get the minimum |
|
1037 /// number of strongly connected components. If we orient the arcs with |
|
1038 /// the dfs algorithm out from the source then we will get such an |
|
1039 /// orientation. |
|
1040 /// |
|
1041 /// We use the \ref DfsVisitor "visitor" interface of the |
|
1042 /// \ref DfsVisit "dfs" algorithm: |
|
1043 ///\code |
|
1044 /// template <typename DirMap> |
|
1045 /// class OrientVisitor : public DfsVisitor<Graph> { |
|
1046 /// public: |
|
1047 /// |
|
1048 /// OrientVisitor(const Graph& graph, DirMap& dirMap) |
|
1049 /// : _graph(graph), _dirMap(dirMap), _processed(graph, false) {} |
|
1050 /// |
|
1051 /// void discover(const Arc& arc) { |
|
1052 /// _processed.set(arc, true); |
|
1053 /// _dirMap.set(arc, _graph.direction(arc)); |
|
1054 /// } |
|
1055 /// |
|
1056 /// void examine(const Arc& arc) { |
|
1057 /// if (_processed[arc]) return; |
|
1058 /// _processed.set(arc, true); |
|
1059 /// _dirMap.set(arc, _graph.direction(arc)); |
|
1060 /// } |
|
1061 /// |
|
1062 /// private: |
|
1063 /// const Graph& _graph; |
|
1064 /// DirMap& _dirMap; |
|
1065 /// Graph::EdgeMap<bool> _processed; |
|
1066 /// }; |
|
1067 ///\endcode |
|
1068 /// |
|
1069 /// And now we can use the orientation: |
|
1070 ///\code |
|
1071 /// Graph::EdgeMap<bool> dmap(graph); |
|
1072 /// |
|
1073 /// typedef OrientVisitor<Graph::EdgeMap<bool> > Visitor; |
|
1074 /// Visitor visitor(graph, dmap); |
|
1075 /// |
|
1076 /// DfsVisit<Graph, Visitor> dfs(graph, visitor); |
|
1077 /// |
|
1078 /// dfs.run(); |
|
1079 /// |
|
1080 /// typedef DirGraphAdaptor<Graph> DGraph; |
|
1081 /// DGraph dgraph(graph, dmap); |
|
1082 /// |
|
1083 /// LEMON_ASSERT(countStronglyConnectedComponents(dgraph) == |
|
1084 /// countBiArcConnectedComponents(graph), "Wrong Orientation"); |
|
1085 ///\endcode |
|
1086 /// |
|
1087 /// The number of the bi-connected components is a lower bound for |
|
1088 /// the number of the strongly connected components in the directed |
|
1089 /// graph because if we contract the bi-connected components to |
|
1090 /// nodes we will get a tree therefore we cannot orient arcs in |
|
1091 /// both direction between bi-connected components. In the other way |
|
1092 /// the algorithm will orient one component to be strongly |
|
1093 /// connected. The two relations proof that the assertion will |
|
1094 /// be always true and the found solution is optimal. |
|
1095 /// |
|
1096 /// \sa DirGraphAdaptorBase |
|
1097 /// \sa dirGraphAdaptor |
|
1098 template<typename _Graph, |
|
1099 typename DirectionMap = typename _Graph::template EdgeMap<bool> > |
|
1100 class DirGraphAdaptor : |
|
1101 public DigraphAdaptorExtender<DirGraphAdaptorBase<_Graph, DirectionMap> > { |
|
1102 public: |
|
1103 typedef _Graph Graph; |
|
1104 typedef DigraphAdaptorExtender< |
|
1105 DirGraphAdaptorBase<_Graph, DirectionMap> > Parent; |
|
1106 protected: |
|
1107 DirGraphAdaptor() { } |
|
1108 public: |
|
1109 |
|
1110 /// \brief Constructor of the adaptor |
|
1111 /// |
|
1112 /// Constructor of the adaptor |
|
1113 DirGraphAdaptor(Graph& graph, DirectionMap& direction) { |
|
1114 setGraph(graph); |
|
1115 setDirectionMap(direction); |
|
1116 } |
|
1117 }; |
|
1118 |
|
1119 /// \brief Just gives back a DirGraphAdaptor |
|
1120 /// |
|
1121 /// Just gives back a DirGraphAdaptor |
|
1122 template<typename Graph, typename DirectionMap> |
|
1123 DirGraphAdaptor<const Graph, DirectionMap> |
|
1124 dirGraphAdaptor(const Graph& graph, DirectionMap& dm) { |
|
1125 return DirGraphAdaptor<const Graph, DirectionMap>(graph, dm); |
|
1126 } |
|
1127 |
|
1128 template<typename Graph, typename DirectionMap> |
|
1129 DirGraphAdaptor<const Graph, const DirectionMap> |
|
1130 dirGraphAdaptor(const Graph& graph, const DirectionMap& dm) { |
|
1131 return DirGraphAdaptor<const Graph, const DirectionMap>(graph, dm); |
|
1132 } |
|
1133 |
|
1134 } |
|
1135 |
|
1136 #endif |