Branch data Line data Source code
1 : : /* -*- mode: C++; indent-tabs-mode: nil; -*-
2 : : *
3 : : * This file is a part of LEMON, a generic C++ optimization library.
4 : : *
5 : : * Copyright (C) 2003-2010
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_ADAPTORS_H
20 : : #define LEMON_ADAPTORS_H
21 : :
22 : : /// \ingroup graph_adaptors
23 : : /// \file
24 : : /// \brief Adaptor classes for digraphs and graphs
25 : : ///
26 : : /// This file contains several useful adaptors for digraphs and graphs.
27 : :
28 : : #include <lemon/core.h>
29 : : #include <lemon/maps.h>
30 : : #include <lemon/bits/variant.h>
31 : :
32 : : #include <lemon/bits/graph_adaptor_extender.h>
33 : : #include <lemon/bits/map_extender.h>
34 : : #include <lemon/tolerance.h>
35 : :
36 : : #include <algorithm>
37 : :
38 : : namespace lemon {
39 : :
40 : : #ifdef _MSC_VER
41 : : #define LEMON_SCOPE_FIX(OUTER, NESTED) OUTER::NESTED
42 : : #else
43 : : #define LEMON_SCOPE_FIX(OUTER, NESTED) typename OUTER::template NESTED
44 : : #endif
45 : :
46 : : template<typename DGR>
47 : : class DigraphAdaptorBase {
48 : : public:
49 : : typedef DGR Digraph;
50 : : typedef DigraphAdaptorBase Adaptor;
51 : :
52 : : protected:
53 : : DGR* _digraph;
54 : 80 : DigraphAdaptorBase() : _digraph(0) { }
55 : 80 : void initialize(DGR& digraph) { _digraph = &digraph; }
56 : :
57 : : public:
58 : : DigraphAdaptorBase(DGR& digraph) : _digraph(&digraph) { }
59 : :
60 : : typedef typename DGR::Node Node;
61 : : typedef typename DGR::Arc Arc;
62 : :
63 : 1004 : void first(Node& i) const { _digraph->first(i); }
64 : : void first(Arc& i) const { _digraph->first(i); }
65 : 2146 : void firstIn(Arc& i, const Node& n) const { _digraph->firstIn(i, n); }
66 : : void firstOut(Arc& i, const Node& n ) const { _digraph->firstOut(i, n); }
67 : :
68 : 5056 : void next(Node& i) const { _digraph->next(i); }
69 : : void next(Arc& i) const { _digraph->next(i); }
70 : 2060 : void nextIn(Arc& i) const { _digraph->nextIn(i); }
71 : : void nextOut(Arc& i) const { _digraph->nextOut(i); }
72 : :
73 : 2060 : Node source(const Arc& a) const { return _digraph->source(a); }
74 : : Node target(const Arc& a) const { return _digraph->target(a); }
75 : :
76 : : typedef NodeNumTagIndicator<DGR> NodeNumTag;
77 : : int nodeNum() const { return _digraph->nodeNum(); }
78 : :
79 : : typedef ArcNumTagIndicator<DGR> ArcNumTag;
80 : : int arcNum() const { return _digraph->arcNum(); }
81 : :
82 : : typedef FindArcTagIndicator<DGR> FindArcTag;
83 : : Arc findArc(const Node& u, const Node& v, const Arc& prev = INVALID) const {
84 : : return _digraph->findArc(u, v, prev);
85 : : }
86 : :
87 : : Node addNode() { return _digraph->addNode(); }
88 : : Arc addArc(const Node& u, const Node& v) { return _digraph->addArc(u, v); }
89 : :
90 : : void erase(const Node& n) { _digraph->erase(n); }
91 : : void erase(const Arc& a) { _digraph->erase(a); }
92 : :
93 : : void clear() { _digraph->clear(); }
94 : :
95 : : int id(const Node& n) const { return _digraph->id(n); }
96 : : int id(const Arc& a) const { return _digraph->id(a); }
97 : :
98 : : Node nodeFromId(int ix) const { return _digraph->nodeFromId(ix); }
99 : : Arc arcFromId(int ix) const { return _digraph->arcFromId(ix); }
100 : :
101 : : int maxNodeId() const { return _digraph->maxNodeId(); }
102 : : int maxArcId() const { return _digraph->maxArcId(); }
103 : :
104 : : typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
105 : : NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
106 : :
107 : : typedef typename ItemSetTraits<DGR, Arc>::ItemNotifier ArcNotifier;
108 : : ArcNotifier& notifier(Arc) const { return _digraph->notifier(Arc()); }
109 : :
110 : : template <typename V>
111 [ - + ][ - + ]: 3012 : class NodeMap : public DGR::template NodeMap<V> {
[ - + ]
112 : : typedef typename DGR::template NodeMap<V> Parent;
113 : :
114 : : public:
115 : 753 : explicit NodeMap(const Adaptor& adaptor)
116 : 753 : : Parent(*adaptor._digraph) {}
117 : : NodeMap(const Adaptor& adaptor, const V& value)
118 : : : Parent(*adaptor._digraph, value) { }
119 : :
120 : : private:
121 : : NodeMap& operator=(const NodeMap& cmap) {
122 : : return operator=<NodeMap>(cmap);
123 : : }
124 : :
125 : : template <typename CMap>
126 : : NodeMap& operator=(const CMap& cmap) {
127 : : Parent::operator=(cmap);
128 : : return *this;
129 : : }
130 : :
131 : : };
132 : :
133 : : template <typename V>
134 : : class ArcMap : public DGR::template ArcMap<V> {
135 : : typedef typename DGR::template ArcMap<V> Parent;
136 : :
137 : : public:
138 : : explicit ArcMap(const DigraphAdaptorBase<DGR>& adaptor)
139 : : : Parent(*adaptor._digraph) {}
140 : : ArcMap(const DigraphAdaptorBase<DGR>& adaptor, const V& value)
141 : : : Parent(*adaptor._digraph, value) {}
142 : :
143 : : private:
144 : : ArcMap& operator=(const ArcMap& cmap) {
145 : : return operator=<ArcMap>(cmap);
146 : : }
147 : :
148 : : template <typename CMap>
149 : : ArcMap& operator=(const CMap& cmap) {
150 : : Parent::operator=(cmap);
151 : : return *this;
152 : : }
153 : :
154 : : };
155 : :
156 : : };
157 : :
158 : : template<typename GR>
159 : : class GraphAdaptorBase {
160 : : public:
161 : : typedef GR Graph;
162 : :
163 : : protected:
164 : : GR* _graph;
165 : :
166 : : GraphAdaptorBase() : _graph(0) {}
167 : :
168 : : void initialize(GR& graph) { _graph = &graph; }
169 : :
170 : : public:
171 : : GraphAdaptorBase(GR& graph) : _graph(&graph) {}
172 : :
173 : : typedef typename GR::Node Node;
174 : : typedef typename GR::Arc Arc;
175 : : typedef typename GR::Edge Edge;
176 : :
177 : : void first(Node& i) const { _graph->first(i); }
178 : : void first(Arc& i) const { _graph->first(i); }
179 : : void first(Edge& i) const { _graph->first(i); }
180 : : void firstIn(Arc& i, const Node& n) const { _graph->firstIn(i, n); }
181 : : void firstOut(Arc& i, const Node& n ) const { _graph->firstOut(i, n); }
182 : : void firstInc(Edge &i, bool &d, const Node &n) const {
183 : : _graph->firstInc(i, d, n);
184 : : }
185 : :
186 : : void next(Node& i) const { _graph->next(i); }
187 : : void next(Arc& i) const { _graph->next(i); }
188 : : void next(Edge& i) const { _graph->next(i); }
189 : : void nextIn(Arc& i) const { _graph->nextIn(i); }
190 : : void nextOut(Arc& i) const { _graph->nextOut(i); }
191 : : void nextInc(Edge &i, bool &d) const { _graph->nextInc(i, d); }
192 : :
193 : : Node u(const Edge& e) const { return _graph->u(e); }
194 : : Node v(const Edge& e) const { return _graph->v(e); }
195 : :
196 : : Node source(const Arc& a) const { return _graph->source(a); }
197 : : Node target(const Arc& a) const { return _graph->target(a); }
198 : :
199 : : typedef NodeNumTagIndicator<Graph> NodeNumTag;
200 : : int nodeNum() const { return _graph->nodeNum(); }
201 : :
202 : : typedef ArcNumTagIndicator<Graph> ArcNumTag;
203 : : int arcNum() const { return _graph->arcNum(); }
204 : :
205 : : typedef EdgeNumTagIndicator<Graph> EdgeNumTag;
206 : : int edgeNum() const { return _graph->edgeNum(); }
207 : :
208 : : typedef FindArcTagIndicator<Graph> FindArcTag;
209 : : Arc findArc(const Node& u, const Node& v,
210 : : const Arc& prev = INVALID) const {
211 : : return _graph->findArc(u, v, prev);
212 : : }
213 : :
214 : : typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
215 : : Edge findEdge(const Node& u, const Node& v,
216 : : const Edge& prev = INVALID) const {
217 : : return _graph->findEdge(u, v, prev);
218 : : }
219 : :
220 : : Node addNode() { return _graph->addNode(); }
221 : : Edge addEdge(const Node& u, const Node& v) { return _graph->addEdge(u, v); }
222 : :
223 : : void erase(const Node& i) { _graph->erase(i); }
224 : : void erase(const Edge& i) { _graph->erase(i); }
225 : :
226 : : void clear() { _graph->clear(); }
227 : :
228 : : bool direction(const Arc& a) const { return _graph->direction(a); }
229 : : Arc direct(const Edge& e, bool d) const { return _graph->direct(e, d); }
230 : :
231 : : int id(const Node& v) const { return _graph->id(v); }
232 : : int id(const Arc& a) const { return _graph->id(a); }
233 : : int id(const Edge& e) const { return _graph->id(e); }
234 : :
235 : : Node nodeFromId(int ix) const { return _graph->nodeFromId(ix); }
236 : : Arc arcFromId(int ix) const { return _graph->arcFromId(ix); }
237 : : Edge edgeFromId(int ix) const { return _graph->edgeFromId(ix); }
238 : :
239 : : int maxNodeId() const { return _graph->maxNodeId(); }
240 : : int maxArcId() const { return _graph->maxArcId(); }
241 : : int maxEdgeId() const { return _graph->maxEdgeId(); }
242 : :
243 : : typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
244 : : NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
245 : :
246 : : typedef typename ItemSetTraits<GR, Arc>::ItemNotifier ArcNotifier;
247 : : ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
248 : :
249 : : typedef typename ItemSetTraits<GR, Edge>::ItemNotifier EdgeNotifier;
250 : : EdgeNotifier& notifier(Edge) const { return _graph->notifier(Edge()); }
251 : :
252 : : template <typename V>
253 : : class NodeMap : public GR::template NodeMap<V> {
254 : : typedef typename GR::template NodeMap<V> Parent;
255 : :
256 : : public:
257 : : explicit NodeMap(const GraphAdaptorBase<GR>& adapter)
258 : : : Parent(*adapter._graph) {}
259 : : NodeMap(const GraphAdaptorBase<GR>& adapter, const V& value)
260 : : : Parent(*adapter._graph, value) {}
261 : :
262 : : private:
263 : : NodeMap& operator=(const NodeMap& cmap) {
264 : : return operator=<NodeMap>(cmap);
265 : : }
266 : :
267 : : template <typename CMap>
268 : : NodeMap& operator=(const CMap& cmap) {
269 : : Parent::operator=(cmap);
270 : : return *this;
271 : : }
272 : :
273 : : };
274 : :
275 : : template <typename V>
276 : : class ArcMap : public GR::template ArcMap<V> {
277 : : typedef typename GR::template ArcMap<V> Parent;
278 : :
279 : : public:
280 : : explicit ArcMap(const GraphAdaptorBase<GR>& adapter)
281 : : : Parent(*adapter._graph) {}
282 : : ArcMap(const GraphAdaptorBase<GR>& adapter, const V& value)
283 : : : Parent(*adapter._graph, value) {}
284 : :
285 : : private:
286 : : ArcMap& operator=(const ArcMap& cmap) {
287 : : return operator=<ArcMap>(cmap);
288 : : }
289 : :
290 : : template <typename CMap>
291 : : ArcMap& operator=(const CMap& cmap) {
292 : : Parent::operator=(cmap);
293 : : return *this;
294 : : }
295 : : };
296 : :
297 : : template <typename V>
298 : : class EdgeMap : public GR::template EdgeMap<V> {
299 : : typedef typename GR::template EdgeMap<V> Parent;
300 : :
301 : : public:
302 : : explicit EdgeMap(const GraphAdaptorBase<GR>& adapter)
303 : : : Parent(*adapter._graph) {}
304 : : EdgeMap(const GraphAdaptorBase<GR>& adapter, const V& value)
305 : : : Parent(*adapter._graph, value) {}
306 : :
307 : : private:
308 : : EdgeMap& operator=(const EdgeMap& cmap) {
309 : : return operator=<EdgeMap>(cmap);
310 : : }
311 : :
312 : : template <typename CMap>
313 : : EdgeMap& operator=(const CMap& cmap) {
314 : : Parent::operator=(cmap);
315 : : return *this;
316 : : }
317 : : };
318 : :
319 : : };
320 : :
321 : : template <typename DGR>
322 : : class ReverseDigraphBase : public DigraphAdaptorBase<DGR> {
323 : : typedef DigraphAdaptorBase<DGR> Parent;
324 : : public:
325 : : typedef DGR Digraph;
326 : : protected:
327 : 160 : ReverseDigraphBase() : Parent() { }
328 : : public:
329 : : typedef typename Parent::Node Node;
330 : : typedef typename Parent::Arc Arc;
331 : :
332 : : void firstIn(Arc& a, const Node& n) const { Parent::firstOut(a, n); }
333 : 2146 : void firstOut(Arc& a, const Node& n ) const { Parent::firstIn(a, n); }
334 : :
335 : : void nextIn(Arc& a) const { Parent::nextOut(a); }
336 : 2060 : void nextOut(Arc& a) const { Parent::nextIn(a); }
337 : :
338 : : Node source(const Arc& a) const { return Parent::target(a); }
339 : 2060 : Node target(const Arc& a) const { return Parent::source(a); }
340 : :
341 : : Arc addArc(const Node& u, const Node& v) { return Parent::addArc(v, u); }
342 : :
343 : : typedef FindArcTagIndicator<DGR> FindArcTag;
344 : : Arc findArc(const Node& u, const Node& v,
345 : : const Arc& prev = INVALID) const {
346 : : return Parent::findArc(v, u, prev);
347 : : }
348 : :
349 : : };
350 : :
351 : : /// \ingroup graph_adaptors
352 : : ///
353 : : /// \brief Adaptor class for reversing the orientation of the arcs in
354 : : /// a digraph.
355 : : ///
356 : : /// ReverseDigraph can be used for reversing the arcs in a digraph.
357 : : /// It conforms to the \ref concepts::Digraph "Digraph" concept.
358 : : ///
359 : : /// The adapted digraph can also be modified through this adaptor
360 : : /// by adding or removing nodes or arcs, unless the \c GR template
361 : : /// parameter is set to be \c const.
362 : : ///
363 : : /// This class provides item counting in the same time as the adapted
364 : : /// digraph structure.
365 : : ///
366 : : /// \tparam DGR The type of the adapted digraph.
367 : : /// It must conform to the \ref concepts::Digraph "Digraph" concept.
368 : : /// It can also be specified to be \c const.
369 : : ///
370 : : /// \note The \c Node and \c Arc types of this adaptor and the adapted
371 : : /// digraph are convertible to each other.
372 : : template<typename DGR>
373 : : #ifdef DOXYGEN
374 : : class ReverseDigraph {
375 : : #else
376 : : class ReverseDigraph :
377 : : public DigraphAdaptorExtender<ReverseDigraphBase<DGR> > {
378 : : #endif
379 : : typedef DigraphAdaptorExtender<ReverseDigraphBase<DGR> > Parent;
380 : : public:
381 : : /// The type of the adapted digraph.
382 : : typedef DGR Digraph;
383 : : protected:
384 : : ReverseDigraph() { }
385 : : public:
386 : :
387 : : /// \brief Constructor
388 : : ///
389 : : /// Creates a reverse digraph adaptor for the given digraph.
390 : 160 : explicit ReverseDigraph(DGR& digraph) {
391 : 80 : Parent::initialize(digraph);
392 : 80 : }
393 : : };
394 : :
395 : : /// \brief Returns a read-only ReverseDigraph adaptor
396 : : ///
397 : : /// This function just returns a read-only \ref ReverseDigraph adaptor.
398 : : /// \ingroup graph_adaptors
399 : : /// \relates ReverseDigraph
400 : : template<typename DGR>
401 : : ReverseDigraph<const DGR> reverseDigraph(const DGR& digraph) {
402 : : return ReverseDigraph<const DGR>(digraph);
403 : : }
404 : :
405 : :
406 : : template <typename DGR, typename NF, typename AF, bool ch = true>
407 : : class SubDigraphBase : public DigraphAdaptorBase<DGR> {
408 : : typedef DigraphAdaptorBase<DGR> Parent;
409 : : public:
410 : : typedef DGR Digraph;
411 : : typedef NF NodeFilterMap;
412 : : typedef AF ArcFilterMap;
413 : :
414 : : typedef SubDigraphBase Adaptor;
415 : : protected:
416 : : NF* _node_filter;
417 : : AF* _arc_filter;
418 : : SubDigraphBase()
419 : : : Parent(), _node_filter(0), _arc_filter(0) { }
420 : :
421 : : void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
422 : : Parent::initialize(digraph);
423 : : _node_filter = &node_filter;
424 : : _arc_filter = &arc_filter;
425 : : }
426 : :
427 : : public:
428 : :
429 : : typedef typename Parent::Node Node;
430 : : typedef typename Parent::Arc Arc;
431 : :
432 : : void first(Node& i) const {
433 : : Parent::first(i);
434 : : while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
435 : : }
436 : :
437 : : void first(Arc& i) const {
438 : : Parent::first(i);
439 : : while (i != INVALID && (!(*_arc_filter)[i]
440 : : || !(*_node_filter)[Parent::source(i)]
441 : : || !(*_node_filter)[Parent::target(i)]))
442 : : Parent::next(i);
443 : : }
444 : :
445 : : void firstIn(Arc& i, const Node& n) const {
446 : : Parent::firstIn(i, n);
447 : : while (i != INVALID && (!(*_arc_filter)[i]
448 : : || !(*_node_filter)[Parent::source(i)]))
449 : : Parent::nextIn(i);
450 : : }
451 : :
452 : : void firstOut(Arc& i, const Node& n) const {
453 : : Parent::firstOut(i, n);
454 : : while (i != INVALID && (!(*_arc_filter)[i]
455 : : || !(*_node_filter)[Parent::target(i)]))
456 : : Parent::nextOut(i);
457 : : }
458 : :
459 : : void next(Node& i) const {
460 : : Parent::next(i);
461 : : while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
462 : : }
463 : :
464 : : void next(Arc& i) const {
465 : : Parent::next(i);
466 : : while (i != INVALID && (!(*_arc_filter)[i]
467 : : || !(*_node_filter)[Parent::source(i)]
468 : : || !(*_node_filter)[Parent::target(i)]))
469 : : Parent::next(i);
470 : : }
471 : :
472 : : void nextIn(Arc& i) const {
473 : : Parent::nextIn(i);
474 : : while (i != INVALID && (!(*_arc_filter)[i]
475 : : || !(*_node_filter)[Parent::source(i)]))
476 : : Parent::nextIn(i);
477 : : }
478 : :
479 : : void nextOut(Arc& i) const {
480 : : Parent::nextOut(i);
481 : : while (i != INVALID && (!(*_arc_filter)[i]
482 : : || !(*_node_filter)[Parent::target(i)]))
483 : : Parent::nextOut(i);
484 : : }
485 : :
486 : : void status(const Node& n, bool v) const { _node_filter->set(n, v); }
487 : : void status(const Arc& a, bool v) const { _arc_filter->set(a, v); }
488 : :
489 : : bool status(const Node& n) const { return (*_node_filter)[n]; }
490 : : bool status(const Arc& a) const { return (*_arc_filter)[a]; }
491 : :
492 : : typedef False NodeNumTag;
493 : : typedef False ArcNumTag;
494 : :
495 : : typedef FindArcTagIndicator<DGR> FindArcTag;
496 : : Arc findArc(const Node& source, const Node& target,
497 : : const Arc& prev = INVALID) const {
498 : : if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
499 : : return INVALID;
500 : : }
501 : : Arc arc = Parent::findArc(source, target, prev);
502 : : while (arc != INVALID && !(*_arc_filter)[arc]) {
503 : : arc = Parent::findArc(source, target, arc);
504 : : }
505 : : return arc;
506 : : }
507 : :
508 : : public:
509 : :
510 : : template <typename V>
511 : : class NodeMap
512 : : : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
513 : : LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
514 : : typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
515 : : LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
516 : :
517 : : public:
518 : : typedef V Value;
519 : :
520 : : NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)
521 : : : Parent(adaptor) {}
522 : : NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor, const V& value)
523 : : : Parent(adaptor, value) {}
524 : :
525 : : private:
526 : : NodeMap& operator=(const NodeMap& cmap) {
527 : : return operator=<NodeMap>(cmap);
528 : : }
529 : :
530 : : template <typename CMap>
531 : : NodeMap& operator=(const CMap& cmap) {
532 : : Parent::operator=(cmap);
533 : : return *this;
534 : : }
535 : : };
536 : :
537 : : template <typename V>
538 : : class ArcMap
539 : : : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
540 : : LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
541 : : typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
542 : : LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
543 : :
544 : : public:
545 : : typedef V Value;
546 : :
547 : : ArcMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)
548 : : : Parent(adaptor) {}
549 : : ArcMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor, const V& value)
550 : : : Parent(adaptor, value) {}
551 : :
552 : : private:
553 : : ArcMap& operator=(const ArcMap& cmap) {
554 : : return operator=<ArcMap>(cmap);
555 : : }
556 : :
557 : : template <typename CMap>
558 : : ArcMap& operator=(const CMap& cmap) {
559 : : Parent::operator=(cmap);
560 : : return *this;
561 : : }
562 : : };
563 : :
564 : : };
565 : :
566 : : template <typename DGR, typename NF, typename AF>
567 : : class SubDigraphBase<DGR, NF, AF, false>
568 : : : public DigraphAdaptorBase<DGR> {
569 : : typedef DigraphAdaptorBase<DGR> Parent;
570 : : public:
571 : : typedef DGR Digraph;
572 : : typedef NF NodeFilterMap;
573 : : typedef AF ArcFilterMap;
574 : :
575 : : typedef SubDigraphBase Adaptor;
576 : : protected:
577 : : NF* _node_filter;
578 : : AF* _arc_filter;
579 : : SubDigraphBase()
580 : : : Parent(), _node_filter(0), _arc_filter(0) { }
581 : :
582 : : void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
583 : : Parent::initialize(digraph);
584 : : _node_filter = &node_filter;
585 : : _arc_filter = &arc_filter;
586 : : }
587 : :
588 : : public:
589 : :
590 : : typedef typename Parent::Node Node;
591 : : typedef typename Parent::Arc Arc;
592 : :
593 : : void first(Node& i) const {
594 : : Parent::first(i);
595 : : while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
596 : : }
597 : :
598 : : void first(Arc& i) const {
599 : : Parent::first(i);
600 : : while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i);
601 : : }
602 : :
603 : : void firstIn(Arc& i, const Node& n) const {
604 : : Parent::firstIn(i, n);
605 : : while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i);
606 : : }
607 : :
608 : : void firstOut(Arc& i, const Node& n) const {
609 : : Parent::firstOut(i, n);
610 : : while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i);
611 : : }
612 : :
613 : : void next(Node& i) const {
614 : : Parent::next(i);
615 : : while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
616 : : }
617 : : void next(Arc& i) const {
618 : : Parent::next(i);
619 : : while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i);
620 : : }
621 : : void nextIn(Arc& i) const {
622 : : Parent::nextIn(i);
623 : : while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i);
624 : : }
625 : :
626 : : void nextOut(Arc& i) const {
627 : : Parent::nextOut(i);
628 : : while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i);
629 : : }
630 : :
631 : : void status(const Node& n, bool v) const { _node_filter->set(n, v); }
632 : : void status(const Arc& a, bool v) const { _arc_filter->set(a, v); }
633 : :
634 : : bool status(const Node& n) const { return (*_node_filter)[n]; }
635 : : bool status(const Arc& a) const { return (*_arc_filter)[a]; }
636 : :
637 : : typedef False NodeNumTag;
638 : : typedef False ArcNumTag;
639 : :
640 : : typedef FindArcTagIndicator<DGR> FindArcTag;
641 : : Arc findArc(const Node& source, const Node& target,
642 : : const Arc& prev = INVALID) const {
643 : : if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
644 : : return INVALID;
645 : : }
646 : : Arc arc = Parent::findArc(source, target, prev);
647 : : while (arc != INVALID && !(*_arc_filter)[arc]) {
648 : : arc = Parent::findArc(source, target, arc);
649 : : }
650 : : return arc;
651 : : }
652 : :
653 : : template <typename V>
654 : : class NodeMap
655 : : : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
656 : : LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
657 : : typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
658 : : LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
659 : :
660 : : public:
661 : : typedef V Value;
662 : :
663 : : NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
664 : : : Parent(adaptor) {}
665 : : NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)
666 : : : Parent(adaptor, value) {}
667 : :
668 : : private:
669 : : NodeMap& operator=(const NodeMap& cmap) {
670 : : return operator=<NodeMap>(cmap);
671 : : }
672 : :
673 : : template <typename CMap>
674 : : NodeMap& operator=(const CMap& cmap) {
675 : : Parent::operator=(cmap);
676 : : return *this;
677 : : }
678 : : };
679 : :
680 : : template <typename V>
681 : : class ArcMap
682 : : : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
683 : : LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
684 : : typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
685 : : LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
686 : :
687 : : public:
688 : : typedef V Value;
689 : :
690 : : ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
691 : : : Parent(adaptor) {}
692 : : ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)
693 : : : Parent(adaptor, value) {}
694 : :
695 : : private:
696 : : ArcMap& operator=(const ArcMap& cmap) {
697 : : return operator=<ArcMap>(cmap);
698 : : }
699 : :
700 : : template <typename CMap>
701 : : ArcMap& operator=(const CMap& cmap) {
702 : : Parent::operator=(cmap);
703 : : return *this;
704 : : }
705 : : };
706 : :
707 : : };
708 : :
709 : : /// \ingroup graph_adaptors
710 : : ///
711 : : /// \brief Adaptor class for hiding nodes and arcs in a digraph
712 : : ///
713 : : /// SubDigraph can be used for hiding nodes and arcs in a digraph.
714 : : /// A \c bool node map and a \c bool arc map must be specified, which
715 : : /// define the filters for nodes and arcs.
716 : : /// Only the nodes and arcs with \c true filter value are
717 : : /// shown in the subdigraph. The arcs that are incident to hidden
718 : : /// nodes are also filtered out.
719 : : /// This adaptor conforms to the \ref concepts::Digraph "Digraph" concept.
720 : : ///
721 : : /// The adapted digraph can also be modified through this adaptor
722 : : /// by adding or removing nodes or arcs, unless the \c GR template
723 : : /// parameter is set to be \c const.
724 : : ///
725 : : /// This class provides only linear time counting for nodes and arcs.
726 : : ///
727 : : /// \tparam DGR The type of the adapted digraph.
728 : : /// It must conform to the \ref concepts::Digraph "Digraph" concept.
729 : : /// It can also be specified to be \c const.
730 : : /// \tparam NF The type of the node filter map.
731 : : /// It must be a \c bool (or convertible) node map of the
732 : : /// adapted digraph. The default type is
733 : : /// \ref concepts::Digraph::NodeMap "DGR::NodeMap<bool>".
734 : : /// \tparam AF The type of the arc filter map.
735 : : /// It must be \c bool (or convertible) arc map of the
736 : : /// adapted digraph. The default type is
737 : : /// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".
738 : : ///
739 : : /// \note The \c Node and \c Arc types of this adaptor and the adapted
740 : : /// digraph are convertible to each other.
741 : : ///
742 : : /// \see FilterNodes
743 : : /// \see FilterArcs
744 : : #ifdef DOXYGEN
745 : : template<typename DGR, typename NF, typename AF>
746 : : class SubDigraph {
747 : : #else
748 : : template<typename DGR,
749 : : typename NF = typename DGR::template NodeMap<bool>,
750 : : typename AF = typename DGR::template ArcMap<bool> >
751 : : class SubDigraph :
752 : : public DigraphAdaptorExtender<SubDigraphBase<DGR, NF, AF, true> > {
753 : : #endif
754 : : public:
755 : : /// The type of the adapted digraph.
756 : : typedef DGR Digraph;
757 : : /// The type of the node filter map.
758 : : typedef NF NodeFilterMap;
759 : : /// The type of the arc filter map.
760 : : typedef AF ArcFilterMap;
761 : :
762 : : typedef DigraphAdaptorExtender<SubDigraphBase<DGR, NF, AF, true> >
763 : : Parent;
764 : :
765 : : typedef typename Parent::Node Node;
766 : : typedef typename Parent::Arc Arc;
767 : :
768 : : protected:
769 : : SubDigraph() { }
770 : : public:
771 : :
772 : : /// \brief Constructor
773 : : ///
774 : : /// Creates a subdigraph for the given digraph with the
775 : : /// given node and arc filter maps.
776 : : SubDigraph(DGR& digraph, NF& node_filter, AF& arc_filter) {
777 : : Parent::initialize(digraph, node_filter, arc_filter);
778 : : }
779 : :
780 : : /// \brief Sets the status of the given node
781 : : ///
782 : : /// This function sets the status of the given node.
783 : : /// It is done by simply setting the assigned value of \c n
784 : : /// to \c v in the node filter map.
785 : : void status(const Node& n, bool v) const { Parent::status(n, v); }
786 : :
787 : : /// \brief Sets the status of the given arc
788 : : ///
789 : : /// This function sets the status of the given arc.
790 : : /// It is done by simply setting the assigned value of \c a
791 : : /// to \c v in the arc filter map.
792 : : void status(const Arc& a, bool v) const { Parent::status(a, v); }
793 : :
794 : : /// \brief Returns the status of the given node
795 : : ///
796 : : /// This function returns the status of the given node.
797 : : /// It is \c true if the given node is enabled (i.e. not hidden).
798 : : bool status(const Node& n) const { return Parent::status(n); }
799 : :
800 : : /// \brief Returns the status of the given arc
801 : : ///
802 : : /// This function returns the status of the given arc.
803 : : /// It is \c true if the given arc is enabled (i.e. not hidden).
804 : : bool status(const Arc& a) const { return Parent::status(a); }
805 : :
806 : : /// \brief Disables the given node
807 : : ///
808 : : /// This function disables the given node in the subdigraph,
809 : : /// so the iteration jumps over it.
810 : : /// It is the same as \ref status() "status(n, false)".
811 : : void disable(const Node& n) const { Parent::status(n, false); }
812 : :
813 : : /// \brief Disables the given arc
814 : : ///
815 : : /// This function disables the given arc in the subdigraph,
816 : : /// so the iteration jumps over it.
817 : : /// It is the same as \ref status() "status(a, false)".
818 : : void disable(const Arc& a) const { Parent::status(a, false); }
819 : :
820 : : /// \brief Enables the given node
821 : : ///
822 : : /// This function enables the given node in the subdigraph.
823 : : /// It is the same as \ref status() "status(n, true)".
824 : : void enable(const Node& n) const { Parent::status(n, true); }
825 : :
826 : : /// \brief Enables the given arc
827 : : ///
828 : : /// This function enables the given arc in the subdigraph.
829 : : /// It is the same as \ref status() "status(a, true)".
830 : : void enable(const Arc& a) const { Parent::status(a, true); }
831 : :
832 : : };
833 : :
834 : : /// \brief Returns a read-only SubDigraph adaptor
835 : : ///
836 : : /// This function just returns a read-only \ref SubDigraph adaptor.
837 : : /// \ingroup graph_adaptors
838 : : /// \relates SubDigraph
839 : : template<typename DGR, typename NF, typename AF>
840 : : SubDigraph<const DGR, NF, AF>
841 : : subDigraph(const DGR& digraph,
842 : : NF& node_filter, AF& arc_filter) {
843 : : return SubDigraph<const DGR, NF, AF>
844 : : (digraph, node_filter, arc_filter);
845 : : }
846 : :
847 : : template<typename DGR, typename NF, typename AF>
848 : : SubDigraph<const DGR, const NF, AF>
849 : : subDigraph(const DGR& digraph,
850 : : const NF& node_filter, AF& arc_filter) {
851 : : return SubDigraph<const DGR, const NF, AF>
852 : : (digraph, node_filter, arc_filter);
853 : : }
854 : :
855 : : template<typename DGR, typename NF, typename AF>
856 : : SubDigraph<const DGR, NF, const AF>
857 : : subDigraph(const DGR& digraph,
858 : : NF& node_filter, const AF& arc_filter) {
859 : : return SubDigraph<const DGR, NF, const AF>
860 : : (digraph, node_filter, arc_filter);
861 : : }
862 : :
863 : : template<typename DGR, typename NF, typename AF>
864 : : SubDigraph<const DGR, const NF, const AF>
865 : : subDigraph(const DGR& digraph,
866 : : const NF& node_filter, const AF& arc_filter) {
867 : : return SubDigraph<const DGR, const NF, const AF>
868 : : (digraph, node_filter, arc_filter);
869 : : }
870 : :
871 : :
872 : : template <typename GR, typename NF, typename EF, bool ch = true>
873 : : class SubGraphBase : public GraphAdaptorBase<GR> {
874 : : typedef GraphAdaptorBase<GR> Parent;
875 : : public:
876 : : typedef GR Graph;
877 : : typedef NF NodeFilterMap;
878 : : typedef EF EdgeFilterMap;
879 : :
880 : : typedef SubGraphBase Adaptor;
881 : : protected:
882 : :
883 : : NF* _node_filter;
884 : : EF* _edge_filter;
885 : :
886 : : SubGraphBase()
887 : : : Parent(), _node_filter(0), _edge_filter(0) { }
888 : :
889 : : void initialize(GR& graph, NF& node_filter, EF& edge_filter) {
890 : : Parent::initialize(graph);
891 : : _node_filter = &node_filter;
892 : : _edge_filter = &edge_filter;
893 : : }
894 : :
895 : : public:
896 : :
897 : : typedef typename Parent::Node Node;
898 : : typedef typename Parent::Arc Arc;
899 : : typedef typename Parent::Edge Edge;
900 : :
901 : : void first(Node& i) const {
902 : : Parent::first(i);
903 : : while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
904 : : }
905 : :
906 : : void first(Arc& i) const {
907 : : Parent::first(i);
908 : : while (i!=INVALID && (!(*_edge_filter)[i]
909 : : || !(*_node_filter)[Parent::source(i)]
910 : : || !(*_node_filter)[Parent::target(i)]))
911 : : Parent::next(i);
912 : : }
913 : :
914 : : void first(Edge& i) const {
915 : : Parent::first(i);
916 : : while (i!=INVALID && (!(*_edge_filter)[i]
917 : : || !(*_node_filter)[Parent::u(i)]
918 : : || !(*_node_filter)[Parent::v(i)]))
919 : : Parent::next(i);
920 : : }
921 : :
922 : : void firstIn(Arc& i, const Node& n) const {
923 : : Parent::firstIn(i, n);
924 : : while (i!=INVALID && (!(*_edge_filter)[i]
925 : : || !(*_node_filter)[Parent::source(i)]))
926 : : Parent::nextIn(i);
927 : : }
928 : :
929 : : void firstOut(Arc& i, const Node& n) const {
930 : : Parent::firstOut(i, n);
931 : : while (i!=INVALID && (!(*_edge_filter)[i]
932 : : || !(*_node_filter)[Parent::target(i)]))
933 : : Parent::nextOut(i);
934 : : }
935 : :
936 : : void firstInc(Edge& i, bool& d, const Node& n) const {
937 : : Parent::firstInc(i, d, n);
938 : : while (i!=INVALID && (!(*_edge_filter)[i]
939 : : || !(*_node_filter)[Parent::u(i)]
940 : : || !(*_node_filter)[Parent::v(i)]))
941 : : Parent::nextInc(i, d);
942 : : }
943 : :
944 : : void next(Node& i) const {
945 : : Parent::next(i);
946 : : while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
947 : : }
948 : :
949 : : void next(Arc& i) const {
950 : : Parent::next(i);
951 : : while (i!=INVALID && (!(*_edge_filter)[i]
952 : : || !(*_node_filter)[Parent::source(i)]
953 : : || !(*_node_filter)[Parent::target(i)]))
954 : : Parent::next(i);
955 : : }
956 : :
957 : : void next(Edge& i) const {
958 : : Parent::next(i);
959 : : while (i!=INVALID && (!(*_edge_filter)[i]
960 : : || !(*_node_filter)[Parent::u(i)]
961 : : || !(*_node_filter)[Parent::v(i)]))
962 : : Parent::next(i);
963 : : }
964 : :
965 : : void nextIn(Arc& i) const {
966 : : Parent::nextIn(i);
967 : : while (i!=INVALID && (!(*_edge_filter)[i]
968 : : || !(*_node_filter)[Parent::source(i)]))
969 : : Parent::nextIn(i);
970 : : }
971 : :
972 : : void nextOut(Arc& i) const {
973 : : Parent::nextOut(i);
974 : : while (i!=INVALID && (!(*_edge_filter)[i]
975 : : || !(*_node_filter)[Parent::target(i)]))
976 : : Parent::nextOut(i);
977 : : }
978 : :
979 : : void nextInc(Edge& i, bool& d) const {
980 : : Parent::nextInc(i, d);
981 : : while (i!=INVALID && (!(*_edge_filter)[i]
982 : : || !(*_node_filter)[Parent::u(i)]
983 : : || !(*_node_filter)[Parent::v(i)]))
984 : : Parent::nextInc(i, d);
985 : : }
986 : :
987 : : void status(const Node& n, bool v) const { _node_filter->set(n, v); }
988 : : void status(const Edge& e, bool v) const { _edge_filter->set(e, v); }
989 : :
990 : : bool status(const Node& n) const { return (*_node_filter)[n]; }
991 : : bool status(const Edge& e) const { return (*_edge_filter)[e]; }
992 : :
993 : : typedef False NodeNumTag;
994 : : typedef False ArcNumTag;
995 : : typedef False EdgeNumTag;
996 : :
997 : : typedef FindArcTagIndicator<Graph> FindArcTag;
998 : : Arc findArc(const Node& u, const Node& v,
999 : : const Arc& prev = INVALID) const {
1000 : : if (!(*_node_filter)[u] || !(*_node_filter)[v]) {
1001 : : return INVALID;
1002 : : }
1003 : : Arc arc = Parent::findArc(u, v, prev);
1004 : : while (arc != INVALID && !(*_edge_filter)[arc]) {
1005 : : arc = Parent::findArc(u, v, arc);
1006 : : }
1007 : : return arc;
1008 : : }
1009 : :
1010 : : typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
1011 : : Edge findEdge(const Node& u, const Node& v,
1012 : : const Edge& prev = INVALID) const {
1013 : : if (!(*_node_filter)[u] || !(*_node_filter)[v]) {
1014 : : return INVALID;
1015 : : }
1016 : : Edge edge = Parent::findEdge(u, v, prev);
1017 : : while (edge != INVALID && !(*_edge_filter)[edge]) {
1018 : : edge = Parent::findEdge(u, v, edge);
1019 : : }
1020 : : return edge;
1021 : : }
1022 : :
1023 : : template <typename V>
1024 : : class NodeMap
1025 : : : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1026 : : LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
1027 : : typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1028 : : LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
1029 : :
1030 : : public:
1031 : : typedef V Value;
1032 : :
1033 : : NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1034 : : : Parent(adaptor) {}
1035 : : NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
1036 : : : Parent(adaptor, value) {}
1037 : :
1038 : : private:
1039 : : NodeMap& operator=(const NodeMap& cmap) {
1040 : : return operator=<NodeMap>(cmap);
1041 : : }
1042 : :
1043 : : template <typename CMap>
1044 : : NodeMap& operator=(const CMap& cmap) {
1045 : : Parent::operator=(cmap);
1046 : : return *this;
1047 : : }
1048 : : };
1049 : :
1050 : : template <typename V>
1051 : : class ArcMap
1052 : : : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1053 : : LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
1054 : : typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1055 : : LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
1056 : :
1057 : : public:
1058 : : typedef V Value;
1059 : :
1060 : : ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1061 : : : Parent(adaptor) {}
1062 : : ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
1063 : : : Parent(adaptor, value) {}
1064 : :
1065 : : private:
1066 : : ArcMap& operator=(const ArcMap& cmap) {
1067 : : return operator=<ArcMap>(cmap);
1068 : : }
1069 : :
1070 : : template <typename CMap>
1071 : : ArcMap& operator=(const CMap& cmap) {
1072 : : Parent::operator=(cmap);
1073 : : return *this;
1074 : : }
1075 : : };
1076 : :
1077 : : template <typename V>
1078 : : class EdgeMap
1079 : : : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1080 : : LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
1081 : : typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1082 : : LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1083 : :
1084 : : public:
1085 : : typedef V Value;
1086 : :
1087 : : EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1088 : : : Parent(adaptor) {}
1089 : :
1090 : : EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
1091 : : : Parent(adaptor, value) {}
1092 : :
1093 : : private:
1094 : : EdgeMap& operator=(const EdgeMap& cmap) {
1095 : : return operator=<EdgeMap>(cmap);
1096 : : }
1097 : :
1098 : : template <typename CMap>
1099 : : EdgeMap& operator=(const CMap& cmap) {
1100 : : Parent::operator=(cmap);
1101 : : return *this;
1102 : : }
1103 : : };
1104 : :
1105 : : };
1106 : :
1107 : : template <typename GR, typename NF, typename EF>
1108 : : class SubGraphBase<GR, NF, EF, false>
1109 : : : public GraphAdaptorBase<GR> {
1110 : : typedef GraphAdaptorBase<GR> Parent;
1111 : : public:
1112 : : typedef GR Graph;
1113 : : typedef NF NodeFilterMap;
1114 : : typedef EF EdgeFilterMap;
1115 : :
1116 : : typedef SubGraphBase Adaptor;
1117 : : protected:
1118 : : NF* _node_filter;
1119 : : EF* _edge_filter;
1120 : : SubGraphBase()
1121 : : : Parent(), _node_filter(0), _edge_filter(0) { }
1122 : :
1123 : : void initialize(GR& graph, NF& node_filter, EF& edge_filter) {
1124 : : Parent::initialize(graph);
1125 : : _node_filter = &node_filter;
1126 : : _edge_filter = &edge_filter;
1127 : : }
1128 : :
1129 : : public:
1130 : :
1131 : : typedef typename Parent::Node Node;
1132 : : typedef typename Parent::Arc Arc;
1133 : : typedef typename Parent::Edge Edge;
1134 : :
1135 : : void first(Node& i) const {
1136 : : Parent::first(i);
1137 : : while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
1138 : : }
1139 : :
1140 : : void first(Arc& i) const {
1141 : : Parent::first(i);
1142 : : while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1143 : : }
1144 : :
1145 : : void first(Edge& i) const {
1146 : : Parent::first(i);
1147 : : while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1148 : : }
1149 : :
1150 : : void firstIn(Arc& i, const Node& n) const {
1151 : : Parent::firstIn(i, n);
1152 : : while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextIn(i);
1153 : : }
1154 : :
1155 : : void firstOut(Arc& i, const Node& n) const {
1156 : : Parent::firstOut(i, n);
1157 : : while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextOut(i);
1158 : : }
1159 : :
1160 : : void firstInc(Edge& i, bool& d, const Node& n) const {
1161 : : Parent::firstInc(i, d, n);
1162 : : while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextInc(i, d);
1163 : : }
1164 : :
1165 : : void next(Node& i) const {
1166 : : Parent::next(i);
1167 : : while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
1168 : : }
1169 : : void next(Arc& i) const {
1170 : : Parent::next(i);
1171 : : while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1172 : : }
1173 : : void next(Edge& i) const {
1174 : : Parent::next(i);
1175 : : while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1176 : : }
1177 : : void nextIn(Arc& i) const {
1178 : : Parent::nextIn(i);
1179 : : while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextIn(i);
1180 : : }
1181 : :
1182 : : void nextOut(Arc& i) const {
1183 : : Parent::nextOut(i);
1184 : : while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextOut(i);
1185 : : }
1186 : : void nextInc(Edge& i, bool& d) const {
1187 : : Parent::nextInc(i, d);
1188 : : while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextInc(i, d);
1189 : : }
1190 : :
1191 : : void status(const Node& n, bool v) const { _node_filter->set(n, v); }
1192 : : void status(const Edge& e, bool v) const { _edge_filter->set(e, v); }
1193 : :
1194 : : bool status(const Node& n) const { return (*_node_filter)[n]; }
1195 : : bool status(const Edge& e) const { return (*_edge_filter)[e]; }
1196 : :
1197 : : typedef False NodeNumTag;
1198 : : typedef False ArcNumTag;
1199 : : typedef False EdgeNumTag;
1200 : :
1201 : : typedef FindArcTagIndicator<Graph> FindArcTag;
1202 : : Arc findArc(const Node& u, const Node& v,
1203 : : const Arc& prev = INVALID) const {
1204 : : Arc arc = Parent::findArc(u, v, prev);
1205 : : while (arc != INVALID && !(*_edge_filter)[arc]) {
1206 : : arc = Parent::findArc(u, v, arc);
1207 : : }
1208 : : return arc;
1209 : : }
1210 : :
1211 : : typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
1212 : : Edge findEdge(const Node& u, const Node& v,
1213 : : const Edge& prev = INVALID) const {
1214 : : Edge edge = Parent::findEdge(u, v, prev);
1215 : : while (edge != INVALID && !(*_edge_filter)[edge]) {
1216 : : edge = Parent::findEdge(u, v, edge);
1217 : : }
1218 : : return edge;
1219 : : }
1220 : :
1221 : : template <typename V>
1222 : : class NodeMap
1223 : : : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1224 : : LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
1225 : : typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1226 : : LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
1227 : :
1228 : : public:
1229 : : typedef V Value;
1230 : :
1231 : : NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1232 : : : Parent(adaptor) {}
1233 : : NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1234 : : : Parent(adaptor, value) {}
1235 : :
1236 : : private:
1237 : : NodeMap& operator=(const NodeMap& cmap) {
1238 : : return operator=<NodeMap>(cmap);
1239 : : }
1240 : :
1241 : : template <typename CMap>
1242 : : NodeMap& operator=(const CMap& cmap) {
1243 : : Parent::operator=(cmap);
1244 : : return *this;
1245 : : }
1246 : : };
1247 : :
1248 : : template <typename V>
1249 : : class ArcMap
1250 : : : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1251 : : LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
1252 : : typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1253 : : LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
1254 : :
1255 : : public:
1256 : : typedef V Value;
1257 : :
1258 : : ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1259 : : : Parent(adaptor) {}
1260 : : ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1261 : : : Parent(adaptor, value) {}
1262 : :
1263 : : private:
1264 : : ArcMap& operator=(const ArcMap& cmap) {
1265 : : return operator=<ArcMap>(cmap);
1266 : : }
1267 : :
1268 : : template <typename CMap>
1269 : : ArcMap& operator=(const CMap& cmap) {
1270 : : Parent::operator=(cmap);
1271 : : return *this;
1272 : : }
1273 : : };
1274 : :
1275 : : template <typename V>
1276 : : class EdgeMap
1277 : : : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1278 : : LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
1279 : : typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1280 : : LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1281 : :
1282 : : public:
1283 : : typedef V Value;
1284 : :
1285 : : EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1286 : : : Parent(adaptor) {}
1287 : :
1288 : : EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1289 : : : Parent(adaptor, value) {}
1290 : :
1291 : : private:
1292 : : EdgeMap& operator=(const EdgeMap& cmap) {
1293 : : return operator=<EdgeMap>(cmap);
1294 : : }
1295 : :
1296 : : template <typename CMap>
1297 : : EdgeMap& operator=(const CMap& cmap) {
1298 : : Parent::operator=(cmap);
1299 : : return *this;
1300 : : }
1301 : : };
1302 : :
1303 : : };
1304 : :
1305 : : /// \ingroup graph_adaptors
1306 : : ///
1307 : : /// \brief Adaptor class for hiding nodes and edges in an undirected
1308 : : /// graph.
1309 : : ///
1310 : : /// SubGraph can be used for hiding nodes and edges in a graph.
1311 : : /// A \c bool node map and a \c bool edge map must be specified, which
1312 : : /// define the filters for nodes and edges.
1313 : : /// Only the nodes and edges with \c true filter value are
1314 : : /// shown in the subgraph. The edges that are incident to hidden
1315 : : /// nodes are also filtered out.
1316 : : /// This adaptor conforms to the \ref concepts::Graph "Graph" concept.
1317 : : ///
1318 : : /// The adapted graph can also be modified through this adaptor
1319 : : /// by adding or removing nodes or edges, unless the \c GR template
1320 : : /// parameter is set to be \c const.
1321 : : ///
1322 : : /// This class provides only linear time counting for nodes, edges and arcs.
1323 : : ///
1324 : : /// \tparam GR The type of the adapted graph.
1325 : : /// It must conform to the \ref concepts::Graph "Graph" concept.
1326 : : /// It can also be specified to be \c const.
1327 : : /// \tparam NF The type of the node filter map.
1328 : : /// It must be a \c bool (or convertible) node map of the
1329 : : /// adapted graph. The default type is
1330 : : /// \ref concepts::Graph::NodeMap "GR::NodeMap<bool>".
1331 : : /// \tparam EF The type of the edge filter map.
1332 : : /// It must be a \c bool (or convertible) edge map of the
1333 : : /// adapted graph. The default type is
1334 : : /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
1335 : : ///
1336 : : /// \note The \c Node, \c Edge and \c Arc types of this adaptor and the
1337 : : /// adapted graph are convertible to each other.
1338 : : ///
1339 : : /// \see FilterNodes
1340 : : /// \see FilterEdges
1341 : : #ifdef DOXYGEN
1342 : : template<typename GR, typename NF, typename EF>
1343 : : class SubGraph {
1344 : : #else
1345 : : template<typename GR,
1346 : : typename NF = typename GR::template NodeMap<bool>,
1347 : : typename EF = typename GR::template EdgeMap<bool> >
1348 : : class SubGraph :
1349 : : public GraphAdaptorExtender<SubGraphBase<GR, NF, EF, true> > {
1350 : : #endif
1351 : : public:
1352 : : /// The type of the adapted graph.
1353 : : typedef GR Graph;
1354 : : /// The type of the node filter map.
1355 : : typedef NF NodeFilterMap;
1356 : : /// The type of the edge filter map.
1357 : : typedef EF EdgeFilterMap;
1358 : :
1359 : : typedef GraphAdaptorExtender<SubGraphBase<GR, NF, EF, true> >
1360 : : Parent;
1361 : :
1362 : : typedef typename Parent::Node Node;
1363 : : typedef typename Parent::Edge Edge;
1364 : :
1365 : : protected:
1366 : : SubGraph() { }
1367 : : public:
1368 : :
1369 : : /// \brief Constructor
1370 : : ///
1371 : : /// Creates a subgraph for the given graph with the given node
1372 : : /// and edge filter maps.
1373 : : SubGraph(GR& graph, NF& node_filter, EF& edge_filter) {
1374 : : initialize(graph, node_filter, edge_filter);
1375 : : }
1376 : :
1377 : : /// \brief Sets the status of the given node
1378 : : ///
1379 : : /// This function sets the status of the given node.
1380 : : /// It is done by simply setting the assigned value of \c n
1381 : : /// to \c v in the node filter map.
1382 : : void status(const Node& n, bool v) const { Parent::status(n, v); }
1383 : :
1384 : : /// \brief Sets the status of the given edge
1385 : : ///
1386 : : /// This function sets the status of the given edge.
1387 : : /// It is done by simply setting the assigned value of \c e
1388 : : /// to \c v in the edge filter map.
1389 : : void status(const Edge& e, bool v) const { Parent::status(e, v); }
1390 : :
1391 : : /// \brief Returns the status of the given node
1392 : : ///
1393 : : /// This function returns the status of the given node.
1394 : : /// It is \c true if the given node is enabled (i.e. not hidden).
1395 : : bool status(const Node& n) const { return Parent::status(n); }
1396 : :
1397 : : /// \brief Returns the status of the given edge
1398 : : ///
1399 : : /// This function returns the status of the given edge.
1400 : : /// It is \c true if the given edge is enabled (i.e. not hidden).
1401 : : bool status(const Edge& e) const { return Parent::status(e); }
1402 : :
1403 : : /// \brief Disables the given node
1404 : : ///
1405 : : /// This function disables the given node in the subdigraph,
1406 : : /// so the iteration jumps over it.
1407 : : /// It is the same as \ref status() "status(n, false)".
1408 : : void disable(const Node& n) const { Parent::status(n, false); }
1409 : :
1410 : : /// \brief Disables the given edge
1411 : : ///
1412 : : /// This function disables the given edge in the subgraph,
1413 : : /// so the iteration jumps over it.
1414 : : /// It is the same as \ref status() "status(e, false)".
1415 : : void disable(const Edge& e) const { Parent::status(e, false); }
1416 : :
1417 : : /// \brief Enables the given node
1418 : : ///
1419 : : /// This function enables the given node in the subdigraph.
1420 : : /// It is the same as \ref status() "status(n, true)".
1421 : : void enable(const Node& n) const { Parent::status(n, true); }
1422 : :
1423 : : /// \brief Enables the given edge
1424 : : ///
1425 : : /// This function enables the given edge in the subgraph.
1426 : : /// It is the same as \ref status() "status(e, true)".
1427 : : void enable(const Edge& e) const { Parent::status(e, true); }
1428 : :
1429 : : };
1430 : :
1431 : : /// \brief Returns a read-only SubGraph adaptor
1432 : : ///
1433 : : /// This function just returns a read-only \ref SubGraph adaptor.
1434 : : /// \ingroup graph_adaptors
1435 : : /// \relates SubGraph
1436 : : template<typename GR, typename NF, typename EF>
1437 : : SubGraph<const GR, NF, EF>
1438 : : subGraph(const GR& graph, NF& node_filter, EF& edge_filter) {
1439 : : return SubGraph<const GR, NF, EF>
1440 : : (graph, node_filter, edge_filter);
1441 : : }
1442 : :
1443 : : template<typename GR, typename NF, typename EF>
1444 : : SubGraph<const GR, const NF, EF>
1445 : : subGraph(const GR& graph, const NF& node_filter, EF& edge_filter) {
1446 : : return SubGraph<const GR, const NF, EF>
1447 : : (graph, node_filter, edge_filter);
1448 : : }
1449 : :
1450 : : template<typename GR, typename NF, typename EF>
1451 : : SubGraph<const GR, NF, const EF>
1452 : : subGraph(const GR& graph, NF& node_filter, const EF& edge_filter) {
1453 : : return SubGraph<const GR, NF, const EF>
1454 : : (graph, node_filter, edge_filter);
1455 : : }
1456 : :
1457 : : template<typename GR, typename NF, typename EF>
1458 : : SubGraph<const GR, const NF, const EF>
1459 : : subGraph(const GR& graph, const NF& node_filter, const EF& edge_filter) {
1460 : : return SubGraph<const GR, const NF, const EF>
1461 : : (graph, node_filter, edge_filter);
1462 : : }
1463 : :
1464 : :
1465 : : /// \ingroup graph_adaptors
1466 : : ///
1467 : : /// \brief Adaptor class for hiding nodes in a digraph or a graph.
1468 : : ///
1469 : : /// FilterNodes adaptor can be used for hiding nodes in a digraph or a
1470 : : /// graph. A \c bool node map must be specified, which defines the filter
1471 : : /// for the nodes. Only the nodes with \c true filter value and the
1472 : : /// arcs/edges incident to nodes both with \c true filter value are shown
1473 : : /// in the subgraph. This adaptor conforms to the \ref concepts::Digraph
1474 : : /// "Digraph" concept or the \ref concepts::Graph "Graph" concept
1475 : : /// depending on the \c GR template parameter.
1476 : : ///
1477 : : /// The adapted (di)graph can also be modified through this adaptor
1478 : : /// by adding or removing nodes or arcs/edges, unless the \c GR template
1479 : : /// parameter is set to be \c const.
1480 : : ///
1481 : : /// This class provides only linear time item counting.
1482 : : ///
1483 : : /// \tparam GR The type of the adapted digraph or graph.
1484 : : /// It must conform to the \ref concepts::Digraph "Digraph" concept
1485 : : /// or the \ref concepts::Graph "Graph" concept.
1486 : : /// It can also be specified to be \c const.
1487 : : /// \tparam NF The type of the node filter map.
1488 : : /// It must be a \c bool (or convertible) node map of the
1489 : : /// adapted (di)graph. The default type is
1490 : : /// \ref concepts::Graph::NodeMap "GR::NodeMap<bool>".
1491 : : ///
1492 : : /// \note The \c Node and <tt>Arc/Edge</tt> types of this adaptor and the
1493 : : /// adapted (di)graph are convertible to each other.
1494 : : #ifdef DOXYGEN
1495 : : template<typename GR, typename NF>
1496 : : class FilterNodes {
1497 : : #else
1498 : : template<typename GR,
1499 : : typename NF = typename GR::template NodeMap<bool>,
1500 : : typename Enable = void>
1501 : : class FilterNodes :
1502 : : public DigraphAdaptorExtender<
1503 : : SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
1504 : : true> > {
1505 : : #endif
1506 : : typedef DigraphAdaptorExtender<
1507 : : SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
1508 : : true> > Parent;
1509 : :
1510 : : public:
1511 : :
1512 : : typedef GR Digraph;
1513 : : typedef NF NodeFilterMap;
1514 : :
1515 : : typedef typename Parent::Node Node;
1516 : :
1517 : : protected:
1518 : : ConstMap<typename Digraph::Arc, Const<bool, true> > const_true_map;
1519 : :
1520 : : FilterNodes() : const_true_map() {}
1521 : :
1522 : : public:
1523 : :
1524 : : /// \brief Constructor
1525 : : ///
1526 : : /// Creates a subgraph for the given digraph or graph with the
1527 : : /// given node filter map.
1528 : : FilterNodes(GR& graph, NF& node_filter)
1529 : : : Parent(), const_true_map()
1530 : : {
1531 : : Parent::initialize(graph, node_filter, const_true_map);
1532 : : }
1533 : :
1534 : : /// \brief Sets the status of the given node
1535 : : ///
1536 : : /// This function sets the status of the given node.
1537 : : /// It is done by simply setting the assigned value of \c n
1538 : : /// to \c v in the node filter map.
1539 : : void status(const Node& n, bool v) const { Parent::status(n, v); }
1540 : :
1541 : : /// \brief Returns the status of the given node
1542 : : ///
1543 : : /// This function returns the status of the given node.
1544 : : /// It is \c true if the given node is enabled (i.e. not hidden).
1545 : : bool status(const Node& n) const { return Parent::status(n); }
1546 : :
1547 : : /// \brief Disables the given node
1548 : : ///
1549 : : /// This function disables the given node, so the iteration
1550 : : /// jumps over it.
1551 : : /// It is the same as \ref status() "status(n, false)".
1552 : : void disable(const Node& n) const { Parent::status(n, false); }
1553 : :
1554 : : /// \brief Enables the given node
1555 : : ///
1556 : : /// This function enables the given node.
1557 : : /// It is the same as \ref status() "status(n, true)".
1558 : : void enable(const Node& n) const { Parent::status(n, true); }
1559 : :
1560 : : };
1561 : :
1562 : : template<typename GR, typename NF>
1563 : : class FilterNodes<GR, NF,
1564 : : typename enable_if<UndirectedTagIndicator<GR> >::type> :
1565 : : public GraphAdaptorExtender<
1566 : : SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,
1567 : : true> > {
1568 : :
1569 : : typedef GraphAdaptorExtender<
1570 : : SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,
1571 : : true> > Parent;
1572 : :
1573 : : public:
1574 : :
1575 : : typedef GR Graph;
1576 : : typedef NF NodeFilterMap;
1577 : :
1578 : : typedef typename Parent::Node Node;
1579 : :
1580 : : protected:
1581 : : ConstMap<typename GR::Edge, Const<bool, true> > const_true_map;
1582 : :
1583 : : FilterNodes() : const_true_map() {}
1584 : :
1585 : : public:
1586 : :
1587 : : FilterNodes(GR& graph, NodeFilterMap& node_filter) :
1588 : : Parent(), const_true_map() {
1589 : : Parent::initialize(graph, node_filter, const_true_map);
1590 : : }
1591 : :
1592 : : void status(const Node& n, bool v) const { Parent::status(n, v); }
1593 : : bool status(const Node& n) const { return Parent::status(n); }
1594 : : void disable(const Node& n) const { Parent::status(n, false); }
1595 : : void enable(const Node& n) const { Parent::status(n, true); }
1596 : :
1597 : : };
1598 : :
1599 : :
1600 : : /// \brief Returns a read-only FilterNodes adaptor
1601 : : ///
1602 : : /// This function just returns a read-only \ref FilterNodes adaptor.
1603 : : /// \ingroup graph_adaptors
1604 : : /// \relates FilterNodes
1605 : : template<typename GR, typename NF>
1606 : : FilterNodes<const GR, NF>
1607 : : filterNodes(const GR& graph, NF& node_filter) {
1608 : : return FilterNodes<const GR, NF>(graph, node_filter);
1609 : : }
1610 : :
1611 : : template<typename GR, typename NF>
1612 : : FilterNodes<const GR, const NF>
1613 : : filterNodes(const GR& graph, const NF& node_filter) {
1614 : : return FilterNodes<const GR, const NF>(graph, node_filter);
1615 : : }
1616 : :
1617 : : /// \ingroup graph_adaptors
1618 : : ///
1619 : : /// \brief Adaptor class for hiding arcs in a digraph.
1620 : : ///
1621 : : /// FilterArcs adaptor can be used for hiding arcs in a digraph.
1622 : : /// A \c bool arc map must be specified, which defines the filter for
1623 : : /// the arcs. Only the arcs with \c true filter value are shown in the
1624 : : /// subdigraph. This adaptor conforms to the \ref concepts::Digraph
1625 : : /// "Digraph" concept.
1626 : : ///
1627 : : /// The adapted digraph can also be modified through this adaptor
1628 : : /// by adding or removing nodes or arcs, unless the \c GR template
1629 : : /// parameter is set to be \c const.
1630 : : ///
1631 : : /// This class provides only linear time counting for nodes and arcs.
1632 : : ///
1633 : : /// \tparam DGR The type of the adapted digraph.
1634 : : /// It must conform to the \ref concepts::Digraph "Digraph" concept.
1635 : : /// It can also be specified to be \c const.
1636 : : /// \tparam AF The type of the arc filter map.
1637 : : /// It must be a \c bool (or convertible) arc map of the
1638 : : /// adapted digraph. The default type is
1639 : : /// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".
1640 : : ///
1641 : : /// \note The \c Node and \c Arc types of this adaptor and the adapted
1642 : : /// digraph are convertible to each other.
1643 : : #ifdef DOXYGEN
1644 : : template<typename DGR,
1645 : : typename AF>
1646 : : class FilterArcs {
1647 : : #else
1648 : : template<typename DGR,
1649 : : typename AF = typename DGR::template ArcMap<bool> >
1650 : : class FilterArcs :
1651 : : public DigraphAdaptorExtender<
1652 : : SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
1653 : : AF, false> > {
1654 : : #endif
1655 : : typedef DigraphAdaptorExtender<
1656 : : SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
1657 : : AF, false> > Parent;
1658 : :
1659 : : public:
1660 : :
1661 : : /// The type of the adapted digraph.
1662 : : typedef DGR Digraph;
1663 : : /// The type of the arc filter map.
1664 : : typedef AF ArcFilterMap;
1665 : :
1666 : : typedef typename Parent::Arc Arc;
1667 : :
1668 : : protected:
1669 : : ConstMap<typename DGR::Node, Const<bool, true> > const_true_map;
1670 : :
1671 : : FilterArcs() : const_true_map() {}
1672 : :
1673 : : public:
1674 : :
1675 : : /// \brief Constructor
1676 : : ///
1677 : : /// Creates a subdigraph for the given digraph with the given arc
1678 : : /// filter map.
1679 : : FilterArcs(DGR& digraph, ArcFilterMap& arc_filter)
1680 : : : Parent(), const_true_map() {
1681 : : Parent::initialize(digraph, const_true_map, arc_filter);
1682 : : }
1683 : :
1684 : : /// \brief Sets the status of the given arc
1685 : : ///
1686 : : /// This function sets the status of the given arc.
1687 : : /// It is done by simply setting the assigned value of \c a
1688 : : /// to \c v in the arc filter map.
1689 : : void status(const Arc& a, bool v) const { Parent::status(a, v); }
1690 : :
1691 : : /// \brief Returns the status of the given arc
1692 : : ///
1693 : : /// This function returns the status of the given arc.
1694 : : /// It is \c true if the given arc is enabled (i.e. not hidden).
1695 : : bool status(const Arc& a) const { return Parent::status(a); }
1696 : :
1697 : : /// \brief Disables the given arc
1698 : : ///
1699 : : /// This function disables the given arc in the subdigraph,
1700 : : /// so the iteration jumps over it.
1701 : : /// It is the same as \ref status() "status(a, false)".
1702 : : void disable(const Arc& a) const { Parent::status(a, false); }
1703 : :
1704 : : /// \brief Enables the given arc
1705 : : ///
1706 : : /// This function enables the given arc in the subdigraph.
1707 : : /// It is the same as \ref status() "status(a, true)".
1708 : : void enable(const Arc& a) const { Parent::status(a, true); }
1709 : :
1710 : : };
1711 : :
1712 : : /// \brief Returns a read-only FilterArcs adaptor
1713 : : ///
1714 : : /// This function just returns a read-only \ref FilterArcs adaptor.
1715 : : /// \ingroup graph_adaptors
1716 : : /// \relates FilterArcs
1717 : : template<typename DGR, typename AF>
1718 : : FilterArcs<const DGR, AF>
1719 : : filterArcs(const DGR& digraph, AF& arc_filter) {
1720 : : return FilterArcs<const DGR, AF>(digraph, arc_filter);
1721 : : }
1722 : :
1723 : : template<typename DGR, typename AF>
1724 : : FilterArcs<const DGR, const AF>
1725 : : filterArcs(const DGR& digraph, const AF& arc_filter) {
1726 : : return FilterArcs<const DGR, const AF>(digraph, arc_filter);
1727 : : }
1728 : :
1729 : : /// \ingroup graph_adaptors
1730 : : ///
1731 : : /// \brief Adaptor class for hiding edges in a graph.
1732 : : ///
1733 : : /// FilterEdges adaptor can be used for hiding edges in a graph.
1734 : : /// A \c bool edge map must be specified, which defines the filter for
1735 : : /// the edges. Only the edges with \c true filter value are shown in the
1736 : : /// subgraph. This adaptor conforms to the \ref concepts::Graph
1737 : : /// "Graph" concept.
1738 : : ///
1739 : : /// The adapted graph can also be modified through this adaptor
1740 : : /// by adding or removing nodes or edges, unless the \c GR template
1741 : : /// parameter is set to be \c const.
1742 : : ///
1743 : : /// This class provides only linear time counting for nodes, edges and arcs.
1744 : : ///
1745 : : /// \tparam GR The type of the adapted graph.
1746 : : /// It must conform to the \ref concepts::Graph "Graph" concept.
1747 : : /// It can also be specified to be \c const.
1748 : : /// \tparam EF The type of the edge filter map.
1749 : : /// It must be a \c bool (or convertible) edge map of the
1750 : : /// adapted graph. The default type is
1751 : : /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
1752 : : ///
1753 : : /// \note The \c Node, \c Edge and \c Arc types of this adaptor and the
1754 : : /// adapted graph are convertible to each other.
1755 : : #ifdef DOXYGEN
1756 : : template<typename GR,
1757 : : typename EF>
1758 : : class FilterEdges {
1759 : : #else
1760 : : template<typename GR,
1761 : : typename EF = typename GR::template EdgeMap<bool> >
1762 : : class FilterEdges :
1763 : : public GraphAdaptorExtender<
1764 : : SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >,
1765 : : EF, false> > {
1766 : : #endif
1767 : : typedef GraphAdaptorExtender<
1768 : : SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >,
1769 : : EF, false> > Parent;
1770 : :
1771 : : public:
1772 : :
1773 : : /// The type of the adapted graph.
1774 : : typedef GR Graph;
1775 : : /// The type of the edge filter map.
1776 : : typedef EF EdgeFilterMap;
1777 : :
1778 : : typedef typename Parent::Edge Edge;
1779 : :
1780 : : protected:
1781 : : ConstMap<typename GR::Node, Const<bool, true> > const_true_map;
1782 : :
1783 : : FilterEdges() : const_true_map(true) {
1784 : : Parent::setNodeFilterMap(const_true_map);
1785 : : }
1786 : :
1787 : : public:
1788 : :
1789 : : /// \brief Constructor
1790 : : ///
1791 : : /// Creates a subgraph for the given graph with the given edge
1792 : : /// filter map.
1793 : : FilterEdges(GR& graph, EF& edge_filter)
1794 : : : Parent(), const_true_map() {
1795 : : Parent::initialize(graph, const_true_map, edge_filter);
1796 : : }
1797 : :
1798 : : /// \brief Sets the status of the given edge
1799 : : ///
1800 : : /// This function sets the status of the given edge.
1801 : : /// It is done by simply setting the assigned value of \c e
1802 : : /// to \c v in the edge filter map.
1803 : : void status(const Edge& e, bool v) const { Parent::status(e, v); }
1804 : :
1805 : : /// \brief Returns the status of the given edge
1806 : : ///
1807 : : /// This function returns the status of the given edge.
1808 : : /// It is \c true if the given edge is enabled (i.e. not hidden).
1809 : : bool status(const Edge& e) const { return Parent::status(e); }
1810 : :
1811 : : /// \brief Disables the given edge
1812 : : ///
1813 : : /// This function disables the given edge in the subgraph,
1814 : : /// so the iteration jumps over it.
1815 : : /// It is the same as \ref status() "status(e, false)".
1816 : : void disable(const Edge& e) const { Parent::status(e, false); }
1817 : :
1818 : : /// \brief Enables the given edge
1819 : : ///
1820 : : /// This function enables the given edge in the subgraph.
1821 : : /// It is the same as \ref status() "status(e, true)".
1822 : : void enable(const Edge& e) const { Parent::status(e, true); }
1823 : :
1824 : : };
1825 : :
1826 : : /// \brief Returns a read-only FilterEdges adaptor
1827 : : ///
1828 : : /// This function just returns a read-only \ref FilterEdges adaptor.
1829 : : /// \ingroup graph_adaptors
1830 : : /// \relates FilterEdges
1831 : : template<typename GR, typename EF>
1832 : : FilterEdges<const GR, EF>
1833 : : filterEdges(const GR& graph, EF& edge_filter) {
1834 : : return FilterEdges<const GR, EF>(graph, edge_filter);
1835 : : }
1836 : :
1837 : : template<typename GR, typename EF>
1838 : : FilterEdges<const GR, const EF>
1839 : : filterEdges(const GR& graph, const EF& edge_filter) {
1840 : : return FilterEdges<const GR, const EF>(graph, edge_filter);
1841 : : }
1842 : :
1843 : :
1844 : : template <typename DGR>
1845 : : class UndirectorBase {
1846 : : public:
1847 : : typedef DGR Digraph;
1848 : : typedef UndirectorBase Adaptor;
1849 : :
1850 : : typedef True UndirectedTag;
1851 : :
1852 : : typedef typename Digraph::Arc Edge;
1853 : : typedef typename Digraph::Node Node;
1854 : :
1855 : : class Arc {
1856 : : friend class UndirectorBase;
1857 : : protected:
1858 : : Edge _edge;
1859 : : bool _forward;
1860 : :
1861 : : Arc(const Edge& edge, bool forward)
1862 : : : _edge(edge), _forward(forward) {}
1863 : :
1864 : : public:
1865 : : Arc() {}
1866 : :
1867 : : Arc(Invalid) : _edge(INVALID), _forward(true) {}
1868 : :
1869 : : operator const Edge&() const { return _edge; }
1870 : :
1871 : : bool operator==(const Arc &other) const {
1872 : : return _forward == other._forward && _edge == other._edge;
1873 : : }
1874 : : bool operator!=(const Arc &other) const {
1875 : : return _forward != other._forward || _edge != other._edge;
1876 : : }
1877 : : bool operator<(const Arc &other) const {
1878 : : return _forward < other._forward ||
1879 : : (_forward == other._forward && _edge < other._edge);
1880 : : }
1881 : : };
1882 : :
1883 : : void first(Node& n) const {
1884 : : _digraph->first(n);
1885 : : }
1886 : :
1887 : : void next(Node& n) const {
1888 : : _digraph->next(n);
1889 : : }
1890 : :
1891 : : void first(Arc& a) const {
1892 : : _digraph->first(a._edge);
1893 : : a._forward = true;
1894 : : }
1895 : :
1896 : : void next(Arc& a) const {
1897 : : if (a._forward) {
1898 : : a._forward = false;
1899 : : } else {
1900 : : _digraph->next(a._edge);
1901 : : a._forward = true;
1902 : : }
1903 : : }
1904 : :
1905 : : void first(Edge& e) const {
1906 : : _digraph->first(e);
1907 : : }
1908 : :
1909 : : void next(Edge& e) const {
1910 : : _digraph->next(e);
1911 : : }
1912 : :
1913 : : void firstOut(Arc& a, const Node& n) const {
1914 : : _digraph->firstIn(a._edge, n);
1915 : : if (a._edge != INVALID ) {
1916 : : a._forward = false;
1917 : : } else {
1918 : : _digraph->firstOut(a._edge, n);
1919 : : a._forward = true;
1920 : : }
1921 : : }
1922 : : void nextOut(Arc &a) const {
1923 : : if (!a._forward) {
1924 : : Node n = _digraph->target(a._edge);
1925 : : _digraph->nextIn(a._edge);
1926 : : if (a._edge == INVALID) {
1927 : : _digraph->firstOut(a._edge, n);
1928 : : a._forward = true;
1929 : : }
1930 : : }
1931 : : else {
1932 : : _digraph->nextOut(a._edge);
1933 : : }
1934 : : }
1935 : :
1936 : : void firstIn(Arc &a, const Node &n) const {
1937 : : _digraph->firstOut(a._edge, n);
1938 : : if (a._edge != INVALID ) {
1939 : : a._forward = false;
1940 : : } else {
1941 : : _digraph->firstIn(a._edge, n);
1942 : : a._forward = true;
1943 : : }
1944 : : }
1945 : : void nextIn(Arc &a) const {
1946 : : if (!a._forward) {
1947 : : Node n = _digraph->source(a._edge);
1948 : : _digraph->nextOut(a._edge);
1949 : : if (a._edge == INVALID ) {
1950 : : _digraph->firstIn(a._edge, n);
1951 : : a._forward = true;
1952 : : }
1953 : : }
1954 : : else {
1955 : : _digraph->nextIn(a._edge);
1956 : : }
1957 : : }
1958 : :
1959 : : void firstInc(Edge &e, bool &d, const Node &n) const {
1960 : : d = true;
1961 : : _digraph->firstOut(e, n);
1962 : : if (e != INVALID) return;
1963 : : d = false;
1964 : : _digraph->firstIn(e, n);
1965 : : }
1966 : :
1967 : : void nextInc(Edge &e, bool &d) const {
1968 : : if (d) {
1969 : : Node s = _digraph->source(e);
1970 : : _digraph->nextOut(e);
1971 : : if (e != INVALID) return;
1972 : : d = false;
1973 : : _digraph->firstIn(e, s);
1974 : : } else {
1975 : : _digraph->nextIn(e);
1976 : : }
1977 : : }
1978 : :
1979 : : Node u(const Edge& e) const {
1980 : : return _digraph->source(e);
1981 : : }
1982 : :
1983 : : Node v(const Edge& e) const {
1984 : : return _digraph->target(e);
1985 : : }
1986 : :
1987 : : Node source(const Arc &a) const {
1988 : : return a._forward ? _digraph->source(a._edge) : _digraph->target(a._edge);
1989 : : }
1990 : :
1991 : : Node target(const Arc &a) const {
1992 : : return a._forward ? _digraph->target(a._edge) : _digraph->source(a._edge);
1993 : : }
1994 : :
1995 : : static Arc direct(const Edge &e, bool d) {
1996 : : return Arc(e, d);
1997 : : }
1998 : :
1999 : : static bool direction(const Arc &a) { return a._forward; }
2000 : :
2001 : : Node nodeFromId(int ix) const { return _digraph->nodeFromId(ix); }
2002 : : Arc arcFromId(int ix) const {
2003 : : return direct(_digraph->arcFromId(ix >> 1), bool(ix & 1));
2004 : : }
2005 : : Edge edgeFromId(int ix) const { return _digraph->arcFromId(ix); }
2006 : :
2007 : : int id(const Node &n) const { return _digraph->id(n); }
2008 : : int id(const Arc &a) const {
2009 : : return (_digraph->id(a) << 1) | (a._forward ? 1 : 0);
2010 : : }
2011 : : int id(const Edge &e) const { return _digraph->id(e); }
2012 : :
2013 : : int maxNodeId() const { return _digraph->maxNodeId(); }
2014 : : int maxArcId() const { return (_digraph->maxArcId() << 1) | 1; }
2015 : : int maxEdgeId() const { return _digraph->maxArcId(); }
2016 : :
2017 : : Node addNode() { return _digraph->addNode(); }
2018 : : Edge addEdge(const Node& u, const Node& v) {
2019 : : return _digraph->addArc(u, v);
2020 : : }
2021 : :
2022 : : void erase(const Node& i) { _digraph->erase(i); }
2023 : : void erase(const Edge& i) { _digraph->erase(i); }
2024 : :
2025 : : void clear() { _digraph->clear(); }
2026 : :
2027 : : typedef NodeNumTagIndicator<Digraph> NodeNumTag;
2028 : : int nodeNum() const { return _digraph->nodeNum(); }
2029 : :
2030 : : typedef ArcNumTagIndicator<Digraph> ArcNumTag;
2031 : : int arcNum() const { return 2 * _digraph->arcNum(); }
2032 : :
2033 : : typedef ArcNumTag EdgeNumTag;
2034 : : int edgeNum() const { return _digraph->arcNum(); }
2035 : :
2036 : : typedef FindArcTagIndicator<Digraph> FindArcTag;
2037 : : Arc findArc(Node s, Node t, Arc p = INVALID) const {
2038 : : if (p == INVALID) {
2039 : : Edge arc = _digraph->findArc(s, t);
2040 : : if (arc != INVALID) return direct(arc, true);
2041 : : arc = _digraph->findArc(t, s);
2042 : : if (arc != INVALID) return direct(arc, false);
2043 : : } else if (direction(p)) {
2044 : : Edge arc = _digraph->findArc(s, t, p);
2045 : : if (arc != INVALID) return direct(arc, true);
2046 : : arc = _digraph->findArc(t, s);
2047 : : if (arc != INVALID) return direct(arc, false);
2048 : : } else {
2049 : : Edge arc = _digraph->findArc(t, s, p);
2050 : : if (arc != INVALID) return direct(arc, false);
2051 : : }
2052 : : return INVALID;
2053 : : }
2054 : :
2055 : : typedef FindArcTag FindEdgeTag;
2056 : : Edge findEdge(Node s, Node t, Edge p = INVALID) const {
2057 : : if (s != t) {
2058 : : if (p == INVALID) {
2059 : : Edge arc = _digraph->findArc(s, t);
2060 : : if (arc != INVALID) return arc;
2061 : : arc = _digraph->findArc(t, s);
2062 : : if (arc != INVALID) return arc;
2063 : : } else if (_digraph->source(p) == s) {
2064 : : Edge arc = _digraph->findArc(s, t, p);
2065 : : if (arc != INVALID) return arc;
2066 : : arc = _digraph->findArc(t, s);
2067 : : if (arc != INVALID) return arc;
2068 : : } else {
2069 : : Edge arc = _digraph->findArc(t, s, p);
2070 : : if (arc != INVALID) return arc;
2071 : : }
2072 : : } else {
2073 : : return _digraph->findArc(s, t, p);
2074 : : }
2075 : : return INVALID;
2076 : : }
2077 : :
2078 : : private:
2079 : :
2080 : : template <typename V>
2081 : : class ArcMapBase {
2082 : : private:
2083 : :
2084 : : typedef typename DGR::template ArcMap<V> MapImpl;
2085 : :
2086 : : public:
2087 : :
2088 : : typedef typename MapTraits<MapImpl>::ReferenceMapTag ReferenceMapTag;
2089 : :
2090 : : typedef V Value;
2091 : : typedef Arc Key;
2092 : : typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReturnValue;
2093 : : typedef typename MapTraits<MapImpl>::ReturnValue ReturnValue;
2094 : : typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReference;
2095 : : typedef typename MapTraits<MapImpl>::ReturnValue Reference;
2096 : :
2097 : : ArcMapBase(const UndirectorBase<DGR>& adaptor) :
2098 : : _forward(*adaptor._digraph), _backward(*adaptor._digraph) {}
2099 : :
2100 : : ArcMapBase(const UndirectorBase<DGR>& adaptor, const V& value)
2101 : : : _forward(*adaptor._digraph, value),
2102 : : _backward(*adaptor._digraph, value) {}
2103 : :
2104 : : void set(const Arc& a, const V& value) {
2105 : : if (direction(a)) {
2106 : : _forward.set(a, value);
2107 : : } else {
2108 : : _backward.set(a, value);
2109 : : }
2110 : : }
2111 : :
2112 : : ConstReturnValue operator[](const Arc& a) const {
2113 : : if (direction(a)) {
2114 : : return _forward[a];
2115 : : } else {
2116 : : return _backward[a];
2117 : : }
2118 : : }
2119 : :
2120 : : ReturnValue operator[](const Arc& a) {
2121 : : if (direction(a)) {
2122 : : return _forward[a];
2123 : : } else {
2124 : : return _backward[a];
2125 : : }
2126 : : }
2127 : :
2128 : : protected:
2129 : :
2130 : : MapImpl _forward, _backward;
2131 : :
2132 : : };
2133 : :
2134 : : public:
2135 : :
2136 : : template <typename V>
2137 : : class NodeMap : public DGR::template NodeMap<V> {
2138 : : typedef typename DGR::template NodeMap<V> Parent;
2139 : :
2140 : : public:
2141 : : typedef V Value;
2142 : :
2143 : : explicit NodeMap(const UndirectorBase<DGR>& adaptor)
2144 : : : Parent(*adaptor._digraph) {}
2145 : :
2146 : : NodeMap(const UndirectorBase<DGR>& adaptor, const V& value)
2147 : : : Parent(*adaptor._digraph, value) { }
2148 : :
2149 : : private:
2150 : : NodeMap& operator=(const NodeMap& cmap) {
2151 : : return operator=<NodeMap>(cmap);
2152 : : }
2153 : :
2154 : : template <typename CMap>
2155 : : NodeMap& operator=(const CMap& cmap) {
2156 : : Parent::operator=(cmap);
2157 : : return *this;
2158 : : }
2159 : :
2160 : : };
2161 : :
2162 : : template <typename V>
2163 : : class ArcMap
2164 : : : public SubMapExtender<UndirectorBase<DGR>, ArcMapBase<V> > {
2165 : : typedef SubMapExtender<UndirectorBase<DGR>, ArcMapBase<V> > Parent;
2166 : :
2167 : : public:
2168 : : typedef V Value;
2169 : :
2170 : : explicit ArcMap(const UndirectorBase<DGR>& adaptor)
2171 : : : Parent(adaptor) {}
2172 : :
2173 : : ArcMap(const UndirectorBase<DGR>& adaptor, const V& value)
2174 : : : Parent(adaptor, value) {}
2175 : :
2176 : : private:
2177 : : ArcMap& operator=(const ArcMap& cmap) {
2178 : : return operator=<ArcMap>(cmap);
2179 : : }
2180 : :
2181 : : template <typename CMap>
2182 : : ArcMap& operator=(const CMap& cmap) {
2183 : : Parent::operator=(cmap);
2184 : : return *this;
2185 : : }
2186 : : };
2187 : :
2188 : : template <typename V>
2189 : : class EdgeMap : public Digraph::template ArcMap<V> {
2190 : : typedef typename Digraph::template ArcMap<V> Parent;
2191 : :
2192 : : public:
2193 : : typedef V Value;
2194 : :
2195 : : explicit EdgeMap(const UndirectorBase<DGR>& adaptor)
2196 : : : Parent(*adaptor._digraph) {}
2197 : :
2198 : : EdgeMap(const UndirectorBase<DGR>& adaptor, const V& value)
2199 : : : Parent(*adaptor._digraph, value) {}
2200 : :
2201 : : private:
2202 : : EdgeMap& operator=(const EdgeMap& cmap) {
2203 : : return operator=<EdgeMap>(cmap);
2204 : : }
2205 : :
2206 : : template <typename CMap>
2207 : : EdgeMap& operator=(const CMap& cmap) {
2208 : : Parent::operator=(cmap);
2209 : : return *this;
2210 : : }
2211 : :
2212 : : };
2213 : :
2214 : : typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
2215 : : NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
2216 : :
2217 : : typedef typename ItemSetTraits<DGR, Edge>::ItemNotifier EdgeNotifier;
2218 : : EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); }
2219 : :
2220 : : typedef EdgeNotifier ArcNotifier;
2221 : : ArcNotifier& notifier(Arc) const { return _digraph->notifier(Edge()); }
2222 : :
2223 : : protected:
2224 : :
2225 : : UndirectorBase() : _digraph(0) {}
2226 : :
2227 : : DGR* _digraph;
2228 : :
2229 : : void initialize(DGR& digraph) {
2230 : : _digraph = &digraph;
2231 : : }
2232 : :
2233 : : };
2234 : :
2235 : : /// \ingroup graph_adaptors
2236 : : ///
2237 : : /// \brief Adaptor class for viewing a digraph as an undirected graph.
2238 : : ///
2239 : : /// Undirector adaptor can be used for viewing a digraph as an undirected
2240 : : /// graph. All arcs of the underlying digraph are showed in the
2241 : : /// adaptor as an edge (and also as a pair of arcs, of course).
2242 : : /// This adaptor conforms to the \ref concepts::Graph "Graph" concept.
2243 : : ///
2244 : : /// The adapted digraph can also be modified through this adaptor
2245 : : /// by adding or removing nodes or edges, unless the \c GR template
2246 : : /// parameter is set to be \c const.
2247 : : ///
2248 : : /// This class provides item counting in the same time as the adapted
2249 : : /// digraph structure.
2250 : : ///
2251 : : /// \tparam DGR The type of the adapted digraph.
2252 : : /// It must conform to the \ref concepts::Digraph "Digraph" concept.
2253 : : /// It can also be specified to be \c const.
2254 : : ///
2255 : : /// \note The \c Node type of this adaptor and the adapted digraph are
2256 : : /// convertible to each other, moreover the \c Edge type of the adaptor
2257 : : /// and the \c Arc type of the adapted digraph are also convertible to
2258 : : /// each other.
2259 : : /// (Thus the \c Arc type of the adaptor is convertible to the \c Arc type
2260 : : /// of the adapted digraph.)
2261 : : template<typename DGR>
2262 : : #ifdef DOXYGEN
2263 : : class Undirector {
2264 : : #else
2265 : : class Undirector :
2266 : : public GraphAdaptorExtender<UndirectorBase<DGR> > {
2267 : : #endif
2268 : : typedef GraphAdaptorExtender<UndirectorBase<DGR> > Parent;
2269 : : public:
2270 : : /// The type of the adapted digraph.
2271 : : typedef DGR Digraph;
2272 : : protected:
2273 : : Undirector() { }
2274 : : public:
2275 : :
2276 : : /// \brief Constructor
2277 : : ///
2278 : : /// Creates an undirected graph from the given digraph.
2279 : : Undirector(DGR& digraph) {
2280 : : initialize(digraph);
2281 : : }
2282 : :
2283 : : /// \brief Arc map combined from two original arc maps
2284 : : ///
2285 : : /// This map adaptor class adapts two arc maps of the underlying
2286 : : /// digraph to get an arc map of the undirected graph.
2287 : : /// Its value type is inherited from the first arc map type (\c FW).
2288 : : /// \tparam FW The type of the "foward" arc map.
2289 : : /// \tparam BK The type of the "backward" arc map.
2290 : : template <typename FW, typename BK>
2291 : : class CombinedArcMap {
2292 : : public:
2293 : :
2294 : : /// The key type of the map
2295 : : typedef typename Parent::Arc Key;
2296 : : /// The value type of the map
2297 : : typedef typename FW::Value Value;
2298 : :
2299 : : typedef typename MapTraits<FW>::ReferenceMapTag ReferenceMapTag;
2300 : :
2301 : : typedef typename MapTraits<FW>::ReturnValue ReturnValue;
2302 : : typedef typename MapTraits<FW>::ConstReturnValue ConstReturnValue;
2303 : : typedef typename MapTraits<FW>::ReturnValue Reference;
2304 : : typedef typename MapTraits<FW>::ConstReturnValue ConstReference;
2305 : :
2306 : : /// Constructor
2307 : : CombinedArcMap(FW& forward, BK& backward)
2308 : : : _forward(&forward), _backward(&backward) {}
2309 : :
2310 : : /// Sets the value associated with the given key.
2311 : : void set(const Key& e, const Value& a) {
2312 : : if (Parent::direction(e)) {
2313 : : _forward->set(e, a);
2314 : : } else {
2315 : : _backward->set(e, a);
2316 : : }
2317 : : }
2318 : :
2319 : : /// Returns the value associated with the given key.
2320 : : ConstReturnValue operator[](const Key& e) const {
2321 : : if (Parent::direction(e)) {
2322 : : return (*_forward)[e];
2323 : : } else {
2324 : : return (*_backward)[e];
2325 : : }
2326 : : }
2327 : :
2328 : : /// Returns a reference to the value associated with the given key.
2329 : : ReturnValue operator[](const Key& e) {
2330 : : if (Parent::direction(e)) {
2331 : : return (*_forward)[e];
2332 : : } else {
2333 : : return (*_backward)[e];
2334 : : }
2335 : : }
2336 : :
2337 : : protected:
2338 : :
2339 : : FW* _forward;
2340 : : BK* _backward;
2341 : :
2342 : : };
2343 : :
2344 : : /// \brief Returns a combined arc map
2345 : : ///
2346 : : /// This function just returns a combined arc map.
2347 : : template <typename FW, typename BK>
2348 : : static CombinedArcMap<FW, BK>
2349 : : combinedArcMap(FW& forward, BK& backward) {
2350 : : return CombinedArcMap<FW, BK>(forward, backward);
2351 : : }
2352 : :
2353 : : template <typename FW, typename BK>
2354 : : static CombinedArcMap<const FW, BK>
2355 : : combinedArcMap(const FW& forward, BK& backward) {
2356 : : return CombinedArcMap<const FW, BK>(forward, backward);
2357 : : }
2358 : :
2359 : : template <typename FW, typename BK>
2360 : : static CombinedArcMap<FW, const BK>
2361 : : combinedArcMap(FW& forward, const BK& backward) {
2362 : : return CombinedArcMap<FW, const BK>(forward, backward);
2363 : : }
2364 : :
2365 : : template <typename FW, typename BK>
2366 : : static CombinedArcMap<const FW, const BK>
2367 : : combinedArcMap(const FW& forward, const BK& backward) {
2368 : : return CombinedArcMap<const FW, const BK>(forward, backward);
2369 : : }
2370 : :
2371 : : };
2372 : :
2373 : : /// \brief Returns a read-only Undirector adaptor
2374 : : ///
2375 : : /// This function just returns a read-only \ref Undirector adaptor.
2376 : : /// \ingroup graph_adaptors
2377 : : /// \relates Undirector
2378 : : template<typename DGR>
2379 : : Undirector<const DGR> undirector(const DGR& digraph) {
2380 : : return Undirector<const DGR>(digraph);
2381 : : }
2382 : :
2383 : :
2384 : : template <typename GR, typename DM>
2385 : : class OrienterBase {
2386 : : public:
2387 : :
2388 : : typedef GR Graph;
2389 : : typedef DM DirectionMap;
2390 : :
2391 : : typedef typename GR::Node Node;
2392 : : typedef typename GR::Edge Arc;
2393 : :
2394 : : void reverseArc(const Arc& arc) {
2395 : : _direction->set(arc, !(*_direction)[arc]);
2396 : : }
2397 : :
2398 : : void first(Node& i) const { _graph->first(i); }
2399 : : void first(Arc& i) const { _graph->first(i); }
2400 : : void firstIn(Arc& i, const Node& n) const {
2401 : : bool d = true;
2402 : : _graph->firstInc(i, d, n);
2403 : : while (i != INVALID && d == (*_direction)[i]) _graph->nextInc(i, d);
2404 : : }
2405 : : void firstOut(Arc& i, const Node& n ) const {
2406 : : bool d = true;
2407 : : _graph->firstInc(i, d, n);
2408 : : while (i != INVALID && d != (*_direction)[i]) _graph->nextInc(i, d);
2409 : : }
2410 : :
2411 : : void next(Node& i) const { _graph->next(i); }
2412 : : void next(Arc& i) const { _graph->next(i); }
2413 : : void nextIn(Arc& i) const {
2414 : : bool d = !(*_direction)[i];
2415 : : _graph->nextInc(i, d);
2416 : : while (i != INVALID && d == (*_direction)[i]) _graph->nextInc(i, d);
2417 : : }
2418 : : void nextOut(Arc& i) const {
2419 : : bool d = (*_direction)[i];
2420 : : _graph->nextInc(i, d);
2421 : : while (i != INVALID && d != (*_direction)[i]) _graph->nextInc(i, d);
2422 : : }
2423 : :
2424 : : Node source(const Arc& e) const {
2425 : : return (*_direction)[e] ? _graph->u(e) : _graph->v(e);
2426 : : }
2427 : : Node target(const Arc& e) const {
2428 : : return (*_direction)[e] ? _graph->v(e) : _graph->u(e);
2429 : : }
2430 : :
2431 : : typedef NodeNumTagIndicator<Graph> NodeNumTag;
2432 : : int nodeNum() const { return _graph->nodeNum(); }
2433 : :
2434 : : typedef EdgeNumTagIndicator<Graph> ArcNumTag;
2435 : : int arcNum() const { return _graph->edgeNum(); }
2436 : :
2437 : : typedef FindEdgeTagIndicator<Graph> FindArcTag;
2438 : : Arc findArc(const Node& u, const Node& v,
2439 : : const Arc& prev = INVALID) const {
2440 : : Arc arc = _graph->findEdge(u, v, prev);
2441 : : while (arc != INVALID && source(arc) != u) {
2442 : : arc = _graph->findEdge(u, v, arc);
2443 : : }
2444 : : return arc;
2445 : : }
2446 : :
2447 : : Node addNode() {
2448 : : return Node(_graph->addNode());
2449 : : }
2450 : :
2451 : : Arc addArc(const Node& u, const Node& v) {
2452 : : Arc arc = _graph->addEdge(u, v);
2453 : : _direction->set(arc, _graph->u(arc) == u);
2454 : : return arc;
2455 : : }
2456 : :
2457 : : void erase(const Node& i) { _graph->erase(i); }
2458 : : void erase(const Arc& i) { _graph->erase(i); }
2459 : :
2460 : : void clear() { _graph->clear(); }
2461 : :
2462 : : int id(const Node& v) const { return _graph->id(v); }
2463 : : int id(const Arc& e) const { return _graph->id(e); }
2464 : :
2465 : : Node nodeFromId(int idx) const { return _graph->nodeFromId(idx); }
2466 : : Arc arcFromId(int idx) const { return _graph->edgeFromId(idx); }
2467 : :
2468 : : int maxNodeId() const { return _graph->maxNodeId(); }
2469 : : int maxArcId() const { return _graph->maxEdgeId(); }
2470 : :
2471 : : typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
2472 : : NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
2473 : :
2474 : : typedef typename ItemSetTraits<GR, Arc>::ItemNotifier ArcNotifier;
2475 : : ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
2476 : :
2477 : : template <typename V>
2478 : : class NodeMap : public GR::template NodeMap<V> {
2479 : : typedef typename GR::template NodeMap<V> Parent;
2480 : :
2481 : : public:
2482 : :
2483 : : explicit NodeMap(const OrienterBase<GR, DM>& adapter)
2484 : : : Parent(*adapter._graph) {}
2485 : :
2486 : : NodeMap(const OrienterBase<GR, DM>& adapter, const V& value)
2487 : : : Parent(*adapter._graph, value) {}
2488 : :
2489 : : private:
2490 : : NodeMap& operator=(const NodeMap& cmap) {
2491 : : return operator=<NodeMap>(cmap);
2492 : : }
2493 : :
2494 : : template <typename CMap>
2495 : : NodeMap& operator=(const CMap& cmap) {
2496 : : Parent::operator=(cmap);
2497 : : return *this;
2498 : : }
2499 : :
2500 : : };
2501 : :
2502 : : template <typename V>
2503 : : class ArcMap : public GR::template EdgeMap<V> {
2504 : : typedef typename Graph::template EdgeMap<V> Parent;
2505 : :
2506 : : public:
2507 : :
2508 : : explicit ArcMap(const OrienterBase<GR, DM>& adapter)
2509 : : : Parent(*adapter._graph) { }
2510 : :
2511 : : ArcMap(const OrienterBase<GR, DM>& adapter, const V& value)
2512 : : : Parent(*adapter._graph, value) { }
2513 : :
2514 : : private:
2515 : : ArcMap& operator=(const ArcMap& cmap) {
2516 : : return operator=<ArcMap>(cmap);
2517 : : }
2518 : :
2519 : : template <typename CMap>
2520 : : ArcMap& operator=(const CMap& cmap) {
2521 : : Parent::operator=(cmap);
2522 : : return *this;
2523 : : }
2524 : : };
2525 : :
2526 : :
2527 : :
2528 : : protected:
2529 : : Graph* _graph;
2530 : : DM* _direction;
2531 : :
2532 : : void initialize(GR& graph, DM& direction) {
2533 : : _graph = &graph;
2534 : : _direction = &direction;
2535 : : }
2536 : :
2537 : : };
2538 : :
2539 : : /// \ingroup graph_adaptors
2540 : : ///
2541 : : /// \brief Adaptor class for orienting the edges of a graph to get a digraph
2542 : : ///
2543 : : /// Orienter adaptor can be used for orienting the edges of a graph to
2544 : : /// get a digraph. A \c bool edge map of the underlying graph must be
2545 : : /// specified, which define the direction of the arcs in the adaptor.
2546 : : /// The arcs can be easily reversed by the \c reverseArc() member function
2547 : : /// of the adaptor.
2548 : : /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
2549 : : ///
2550 : : /// The adapted graph can also be modified through this adaptor
2551 : : /// by adding or removing nodes or arcs, unless the \c GR template
2552 : : /// parameter is set to be \c const.
2553 : : ///
2554 : : /// This class provides item counting in the same time as the adapted
2555 : : /// graph structure.
2556 : : ///
2557 : : /// \tparam GR The type of the adapted graph.
2558 : : /// It must conform to the \ref concepts::Graph "Graph" concept.
2559 : : /// It can also be specified to be \c const.
2560 : : /// \tparam DM The type of the direction map.
2561 : : /// It must be a \c bool (or convertible) edge map of the
2562 : : /// adapted graph. The default type is
2563 : : /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
2564 : : ///
2565 : : /// \note The \c Node type of this adaptor and the adapted graph are
2566 : : /// convertible to each other, moreover the \c Arc type of the adaptor
2567 : : /// and the \c Edge type of the adapted graph are also convertible to
2568 : : /// each other.
2569 : : #ifdef DOXYGEN
2570 : : template<typename GR,
2571 : : typename DM>
2572 : : class Orienter {
2573 : : #else
2574 : : template<typename GR,
2575 : : typename DM = typename GR::template EdgeMap<bool> >
2576 : : class Orienter :
2577 : : public DigraphAdaptorExtender<OrienterBase<GR, DM> > {
2578 : : #endif
2579 : : typedef DigraphAdaptorExtender<OrienterBase<GR, DM> > Parent;
2580 : : public:
2581 : :
2582 : : /// The type of the adapted graph.
2583 : : typedef GR Graph;
2584 : : /// The type of the direction edge map.
2585 : : typedef DM DirectionMap;
2586 : :
2587 : : typedef typename Parent::Arc Arc;
2588 : :
2589 : : protected:
2590 : : Orienter() { }
2591 : :
2592 : : public:
2593 : :
2594 : : /// \brief Constructor
2595 : : ///
2596 : : /// Constructor of the adaptor.
2597 : : Orienter(GR& graph, DM& direction) {
2598 : : Parent::initialize(graph, direction);
2599 : : }
2600 : :
2601 : : /// \brief Reverses the given arc
2602 : : ///
2603 : : /// This function reverses the given arc.
2604 : : /// It is done by simply negate the assigned value of \c a
2605 : : /// in the direction map.
2606 : : void reverseArc(const Arc& a) {
2607 : : Parent::reverseArc(a);
2608 : : }
2609 : : };
2610 : :
2611 : : /// \brief Returns a read-only Orienter adaptor
2612 : : ///
2613 : : /// This function just returns a read-only \ref Orienter adaptor.
2614 : : /// \ingroup graph_adaptors
2615 : : /// \relates Orienter
2616 : : template<typename GR, typename DM>
2617 : : Orienter<const GR, DM>
2618 : : orienter(const GR& graph, DM& direction) {
2619 : : return Orienter<const GR, DM>(graph, direction);
2620 : : }
2621 : :
2622 : : template<typename GR, typename DM>
2623 : : Orienter<const GR, const DM>
2624 : : orienter(const GR& graph, const DM& direction) {
2625 : : return Orienter<const GR, const DM>(graph, direction);
2626 : : }
2627 : :
2628 : : namespace _adaptor_bits {
2629 : :
2630 : : template <typename DGR, typename CM, typename FM, typename TL>
2631 : : class ResForwardFilter {
2632 : : public:
2633 : :
2634 : : typedef typename DGR::Arc Key;
2635 : : typedef bool Value;
2636 : :
2637 : : private:
2638 : :
2639 : : const CM* _capacity;
2640 : : const FM* _flow;
2641 : : TL _tolerance;
2642 : :
2643 : : public:
2644 : :
2645 : : ResForwardFilter(const CM& capacity, const FM& flow,
2646 : : const TL& tolerance = TL())
2647 : : : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
2648 : :
2649 : : bool operator[](const typename DGR::Arc& a) const {
2650 : : return _tolerance.positive((*_capacity)[a] - (*_flow)[a]);
2651 : : }
2652 : : };
2653 : :
2654 : : template<typename DGR,typename CM, typename FM, typename TL>
2655 : : class ResBackwardFilter {
2656 : : public:
2657 : :
2658 : : typedef typename DGR::Arc Key;
2659 : : typedef bool Value;
2660 : :
2661 : : private:
2662 : :
2663 : : const CM* _capacity;
2664 : : const FM* _flow;
2665 : : TL _tolerance;
2666 : :
2667 : : public:
2668 : :
2669 : : ResBackwardFilter(const CM& capacity, const FM& flow,
2670 : : const TL& tolerance = TL())
2671 : : : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
2672 : :
2673 : : bool operator[](const typename DGR::Arc& a) const {
2674 : : return _tolerance.positive((*_flow)[a]);
2675 : : }
2676 : : };
2677 : :
2678 : : }
2679 : :
2680 : : /// \ingroup graph_adaptors
2681 : : ///
2682 : : /// \brief Adaptor class for composing the residual digraph for directed
2683 : : /// flow and circulation problems.
2684 : : ///
2685 : : /// ResidualDigraph can be used for composing the \e residual digraph
2686 : : /// for directed flow and circulation problems. Let \f$ G=(V, A) \f$
2687 : : /// be a directed graph and let \f$ F \f$ be a number type.
2688 : : /// Let \f$ flow, cap: A\to F \f$ be functions on the arcs.
2689 : : /// This adaptor implements a digraph structure with node set \f$ V \f$
2690 : : /// and arc set \f$ A_{forward}\cup A_{backward} \f$,
2691 : : /// where \f$ A_{forward}=\{uv : uv\in A, flow(uv)<cap(uv)\} \f$ and
2692 : : /// \f$ A_{backward}=\{vu : uv\in A, flow(uv)>0\} \f$, i.e. the so
2693 : : /// called residual digraph.
2694 : : /// When the union \f$ A_{forward}\cup A_{backward} \f$ is taken,
2695 : : /// multiplicities are counted, i.e. the adaptor has exactly
2696 : : /// \f$ |A_{forward}| + |A_{backward}|\f$ arcs (it may have parallel
2697 : : /// arcs).
2698 : : /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
2699 : : ///
2700 : : /// This class provides only linear time counting for nodes and arcs.
2701 : : ///
2702 : : /// \tparam DGR The type of the adapted digraph.
2703 : : /// It must conform to the \ref concepts::Digraph "Digraph" concept.
2704 : : /// It is implicitly \c const.
2705 : : /// \tparam CM The type of the capacity map.
2706 : : /// It must be an arc map of some numerical type, which defines
2707 : : /// the capacities in the flow problem. It is implicitly \c const.
2708 : : /// The default type is
2709 : : /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
2710 : : /// \tparam FM The type of the flow map.
2711 : : /// It must be an arc map of some numerical type, which defines
2712 : : /// the flow values in the flow problem. The default type is \c CM.
2713 : : /// \tparam TL The tolerance type for handling inexact computation.
2714 : : /// The default tolerance type depends on the value type of the
2715 : : /// capacity map.
2716 : : ///
2717 : : /// \note This adaptor is implemented using Undirector and FilterArcs
2718 : : /// adaptors.
2719 : : ///
2720 : : /// \note The \c Node type of this adaptor and the adapted digraph are
2721 : : /// convertible to each other, moreover the \c Arc type of the adaptor
2722 : : /// is convertible to the \c Arc type of the adapted digraph.
2723 : : #ifdef DOXYGEN
2724 : : template<typename DGR, typename CM, typename FM, typename TL>
2725 : : class ResidualDigraph
2726 : : #else
2727 : : template<typename DGR,
2728 : : typename CM = typename DGR::template ArcMap<int>,
2729 : : typename FM = CM,
2730 : : typename TL = Tolerance<typename CM::Value> >
2731 : : class ResidualDigraph
2732 : : : public SubDigraph<
2733 : : Undirector<const DGR>,
2734 : : ConstMap<typename DGR::Node, Const<bool, true> >,
2735 : : typename Undirector<const DGR>::template CombinedArcMap<
2736 : : _adaptor_bits::ResForwardFilter<const DGR, CM, FM, TL>,
2737 : : _adaptor_bits::ResBackwardFilter<const DGR, CM, FM, TL> > >
2738 : : #endif
2739 : : {
2740 : : public:
2741 : :
2742 : : /// The type of the underlying digraph.
2743 : : typedef DGR Digraph;
2744 : : /// The type of the capacity map.
2745 : : typedef CM CapacityMap;
2746 : : /// The type of the flow map.
2747 : : typedef FM FlowMap;
2748 : : /// The tolerance type.
2749 : : typedef TL Tolerance;
2750 : :
2751 : : typedef typename CapacityMap::Value Value;
2752 : : typedef ResidualDigraph Adaptor;
2753 : :
2754 : : protected:
2755 : :
2756 : : typedef Undirector<const Digraph> Undirected;
2757 : :
2758 : : typedef ConstMap<typename DGR::Node, Const<bool, true> > NodeFilter;
2759 : :
2760 : : typedef _adaptor_bits::ResForwardFilter<const DGR, CM,
2761 : : FM, TL> ForwardFilter;
2762 : :
2763 : : typedef _adaptor_bits::ResBackwardFilter<const DGR, CM,
2764 : : FM, TL> BackwardFilter;
2765 : :
2766 : : typedef typename Undirected::
2767 : : template CombinedArcMap<ForwardFilter, BackwardFilter> ArcFilter;
2768 : :
2769 : : typedef SubDigraph<Undirected, NodeFilter, ArcFilter> Parent;
2770 : :
2771 : : const CapacityMap* _capacity;
2772 : : FlowMap* _flow;
2773 : :
2774 : : Undirected _graph;
2775 : : NodeFilter _node_filter;
2776 : : ForwardFilter _forward_filter;
2777 : : BackwardFilter _backward_filter;
2778 : : ArcFilter _arc_filter;
2779 : :
2780 : : public:
2781 : :
2782 : : /// \brief Constructor
2783 : : ///
2784 : : /// Constructor of the residual digraph adaptor. The parameters are the
2785 : : /// digraph, the capacity map, the flow map, and a tolerance object.
2786 : : ResidualDigraph(const DGR& digraph, const CM& capacity,
2787 : : FM& flow, const TL& tolerance = Tolerance())
2788 : : : Parent(), _capacity(&capacity), _flow(&flow),
2789 : : _graph(digraph), _node_filter(),
2790 : : _forward_filter(capacity, flow, tolerance),
2791 : : _backward_filter(capacity, flow, tolerance),
2792 : : _arc_filter(_forward_filter, _backward_filter)
2793 : : {
2794 : : Parent::initialize(_graph, _node_filter, _arc_filter);
2795 : : }
2796 : :
2797 : : typedef typename Parent::Arc Arc;
2798 : :
2799 : : /// \brief Returns the residual capacity of the given arc.
2800 : : ///
2801 : : /// Returns the residual capacity of the given arc.
2802 : : Value residualCapacity(const Arc& a) const {
2803 : : if (Undirected::direction(a)) {
2804 : : return (*_capacity)[a] - (*_flow)[a];
2805 : : } else {
2806 : : return (*_flow)[a];
2807 : : }
2808 : : }
2809 : :
2810 : : /// \brief Augments on the given arc in the residual digraph.
2811 : : ///
2812 : : /// Augments on the given arc in the residual digraph. It increases
2813 : : /// or decreases the flow value on the original arc according to the
2814 : : /// direction of the residual arc.
2815 : : void augment(const Arc& a, const Value& v) const {
2816 : : if (Undirected::direction(a)) {
2817 : : _flow->set(a, (*_flow)[a] + v);
2818 : : } else {
2819 : : _flow->set(a, (*_flow)[a] - v);
2820 : : }
2821 : : }
2822 : :
2823 : : /// \brief Returns \c true if the given residual arc is a forward arc.
2824 : : ///
2825 : : /// Returns \c true if the given residual arc has the same orientation
2826 : : /// as the original arc, i.e. it is a so called forward arc.
2827 : : static bool forward(const Arc& a) {
2828 : : return Undirected::direction(a);
2829 : : }
2830 : :
2831 : : /// \brief Returns \c true if the given residual arc is a backward arc.
2832 : : ///
2833 : : /// Returns \c true if the given residual arc has the opposite orientation
2834 : : /// than the original arc, i.e. it is a so called backward arc.
2835 : : static bool backward(const Arc& a) {
2836 : : return !Undirected::direction(a);
2837 : : }
2838 : :
2839 : : /// \brief Returns the forward oriented residual arc.
2840 : : ///
2841 : : /// Returns the forward oriented residual arc related to the given
2842 : : /// arc of the underlying digraph.
2843 : : static Arc forward(const typename Digraph::Arc& a) {
2844 : : return Undirected::direct(a, true);
2845 : : }
2846 : :
2847 : : /// \brief Returns the backward oriented residual arc.
2848 : : ///
2849 : : /// Returns the backward oriented residual arc related to the given
2850 : : /// arc of the underlying digraph.
2851 : : static Arc backward(const typename Digraph::Arc& a) {
2852 : : return Undirected::direct(a, false);
2853 : : }
2854 : :
2855 : : /// \brief Residual capacity map.
2856 : : ///
2857 : : /// This map adaptor class can be used for obtaining the residual
2858 : : /// capacities as an arc map of the residual digraph.
2859 : : /// Its value type is inherited from the capacity map.
2860 : : class ResidualCapacity {
2861 : : protected:
2862 : : const Adaptor* _adaptor;
2863 : : public:
2864 : : /// The key type of the map
2865 : : typedef Arc Key;
2866 : : /// The value type of the map
2867 : : typedef typename CapacityMap::Value Value;
2868 : :
2869 : : /// Constructor
2870 : : ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor)
2871 : : : _adaptor(&adaptor) {}
2872 : :
2873 : : /// Returns the value associated with the given residual arc
2874 : : Value operator[](const Arc& a) const {
2875 : : return _adaptor->residualCapacity(a);
2876 : : }
2877 : :
2878 : : };
2879 : :
2880 : : /// \brief Returns a residual capacity map
2881 : : ///
2882 : : /// This function just returns a residual capacity map.
2883 : : ResidualCapacity residualCapacity() const {
2884 : : return ResidualCapacity(*this);
2885 : : }
2886 : :
2887 : : };
2888 : :
2889 : : /// \brief Returns a (read-only) Residual adaptor
2890 : : ///
2891 : : /// This function just returns a (read-only) \ref ResidualDigraph adaptor.
2892 : : /// \ingroup graph_adaptors
2893 : : /// \relates ResidualDigraph
2894 : : template<typename DGR, typename CM, typename FM>
2895 : : ResidualDigraph<DGR, CM, FM>
2896 : : residualDigraph(const DGR& digraph, const CM& capacity_map, FM& flow_map) {
2897 : : return ResidualDigraph<DGR, CM, FM> (digraph, capacity_map, flow_map);
2898 : : }
2899 : :
2900 : :
2901 : : template <typename DGR>
2902 : : class SplitNodesBase {
2903 : : typedef DigraphAdaptorBase<const DGR> Parent;
2904 : :
2905 : : public:
2906 : :
2907 : : typedef DGR Digraph;
2908 : : typedef SplitNodesBase Adaptor;
2909 : :
2910 : : typedef typename DGR::Node DigraphNode;
2911 : : typedef typename DGR::Arc DigraphArc;
2912 : :
2913 : : class Node;
2914 : : class Arc;
2915 : :
2916 : : private:
2917 : :
2918 : : template <typename T> class NodeMapBase;
2919 : : template <typename T> class ArcMapBase;
2920 : :
2921 : : public:
2922 : :
2923 : : class Node : public DigraphNode {
2924 : : friend class SplitNodesBase;
2925 : : template <typename T> friend class NodeMapBase;
2926 : : private:
2927 : :
2928 : : bool _in;
2929 : : Node(DigraphNode node, bool in)
2930 : : : DigraphNode(node), _in(in) {}
2931 : :
2932 : : public:
2933 : :
2934 : : Node() {}
2935 : : Node(Invalid) : DigraphNode(INVALID), _in(true) {}
2936 : :
2937 : : bool operator==(const Node& node) const {
2938 : : return DigraphNode::operator==(node) && _in == node._in;
2939 : : }
2940 : :
2941 : : bool operator!=(const Node& node) const {
2942 : : return !(*this == node);
2943 : : }
2944 : :
2945 : : bool operator<(const Node& node) const {
2946 : : return DigraphNode::operator<(node) ||
2947 : : (DigraphNode::operator==(node) && _in < node._in);
2948 : : }
2949 : : };
2950 : :
2951 : : class Arc {
2952 : : friend class SplitNodesBase;
2953 : : template <typename T> friend class ArcMapBase;
2954 : : private:
2955 : : typedef BiVariant<DigraphArc, DigraphNode> ArcImpl;
2956 : :
2957 : : explicit Arc(const DigraphArc& arc) : _item(arc) {}
2958 : : explicit Arc(const DigraphNode& node) : _item(node) {}
2959 : :
2960 : : ArcImpl _item;
2961 : :
2962 : : public:
2963 : : Arc() {}
2964 : : Arc(Invalid) : _item(DigraphArc(INVALID)) {}
2965 : :
2966 : : bool operator==(const Arc& arc) const {
2967 : : if (_item.firstState()) {
2968 : : if (arc._item.firstState()) {
2969 : : return _item.first() == arc._item.first();
2970 : : }
2971 : : } else {
2972 : : if (arc._item.secondState()) {
2973 : : return _item.second() == arc._item.second();
2974 : : }
2975 : : }
2976 : : return false;
2977 : : }
2978 : :
2979 : : bool operator!=(const Arc& arc) const {
2980 : : return !(*this == arc);
2981 : : }
2982 : :
2983 : : bool operator<(const Arc& arc) const {
2984 : : if (_item.firstState()) {
2985 : : if (arc._item.firstState()) {
2986 : : return _item.first() < arc._item.first();
2987 : : }
2988 : : return false;
2989 : : } else {
2990 : : if (arc._item.secondState()) {
2991 : : return _item.second() < arc._item.second();
2992 : : }
2993 : : return true;
2994 : : }
2995 : : }
2996 : :
2997 : : operator DigraphArc() const { return _item.first(); }
2998 : : operator DigraphNode() const { return _item.second(); }
2999 : :
3000 : : };
3001 : :
3002 : : void first(Node& n) const {
3003 : : _digraph->first(n);
3004 : : n._in = true;
3005 : : }
3006 : :
3007 : : void next(Node& n) const {
3008 : : if (n._in) {
3009 : : n._in = false;
3010 : : } else {
3011 : : n._in = true;
3012 : : _digraph->next(n);
3013 : : }
3014 : : }
3015 : :
3016 : : void first(Arc& e) const {
3017 : : e._item.setSecond();
3018 : : _digraph->first(e._item.second());
3019 : : if (e._item.second() == INVALID) {
3020 : : e._item.setFirst();
3021 : : _digraph->first(e._item.first());
3022 : : }
3023 : : }
3024 : :
3025 : : void next(Arc& e) const {
3026 : : if (e._item.secondState()) {
3027 : : _digraph->next(e._item.second());
3028 : : if (e._item.second() == INVALID) {
3029 : : e._item.setFirst();
3030 : : _digraph->first(e._item.first());
3031 : : }
3032 : : } else {
3033 : : _digraph->next(e._item.first());
3034 : : }
3035 : : }
3036 : :
3037 : : void firstOut(Arc& e, const Node& n) const {
3038 : : if (n._in) {
3039 : : e._item.setSecond(n);
3040 : : } else {
3041 : : e._item.setFirst();
3042 : : _digraph->firstOut(e._item.first(), n);
3043 : : }
3044 : : }
3045 : :
3046 : : void nextOut(Arc& e) const {
3047 : : if (!e._item.firstState()) {
3048 : : e._item.setFirst(INVALID);
3049 : : } else {
3050 : : _digraph->nextOut(e._item.first());
3051 : : }
3052 : : }
3053 : :
3054 : : void firstIn(Arc& e, const Node& n) const {
3055 : : if (!n._in) {
3056 : : e._item.setSecond(n);
3057 : : } else {
3058 : : e._item.setFirst();
3059 : : _digraph->firstIn(e._item.first(), n);
3060 : : }
3061 : : }
3062 : :
3063 : : void nextIn(Arc& e) const {
3064 : : if (!e._item.firstState()) {
3065 : : e._item.setFirst(INVALID);
3066 : : } else {
3067 : : _digraph->nextIn(e._item.first());
3068 : : }
3069 : : }
3070 : :
3071 : : Node source(const Arc& e) const {
3072 : : if (e._item.firstState()) {
3073 : : return Node(_digraph->source(e._item.first()), false);
3074 : : } else {
3075 : : return Node(e._item.second(), true);
3076 : : }
3077 : : }
3078 : :
3079 : : Node target(const Arc& e) const {
3080 : : if (e._item.firstState()) {
3081 : : return Node(_digraph->target(e._item.first()), true);
3082 : : } else {
3083 : : return Node(e._item.second(), false);
3084 : : }
3085 : : }
3086 : :
3087 : : int id(const Node& n) const {
3088 : : return (_digraph->id(n) << 1) | (n._in ? 0 : 1);
3089 : : }
3090 : : Node nodeFromId(int ix) const {
3091 : : return Node(_digraph->nodeFromId(ix >> 1), (ix & 1) == 0);
3092 : : }
3093 : : int maxNodeId() const {
3094 : : return 2 * _digraph->maxNodeId() + 1;
3095 : : }
3096 : :
3097 : : int id(const Arc& e) const {
3098 : : if (e._item.firstState()) {
3099 : : return _digraph->id(e._item.first()) << 1;
3100 : : } else {
3101 : : return (_digraph->id(e._item.second()) << 1) | 1;
3102 : : }
3103 : : }
3104 : : Arc arcFromId(int ix) const {
3105 : : if ((ix & 1) == 0) {
3106 : : return Arc(_digraph->arcFromId(ix >> 1));
3107 : : } else {
3108 : : return Arc(_digraph->nodeFromId(ix >> 1));
3109 : : }
3110 : : }
3111 : : int maxArcId() const {
3112 : : return std::max(_digraph->maxNodeId() << 1,
3113 : : (_digraph->maxArcId() << 1) | 1);
3114 : : }
3115 : :
3116 : : static bool inNode(const Node& n) {
3117 : : return n._in;
3118 : : }
3119 : :
3120 : : static bool outNode(const Node& n) {
3121 : : return !n._in;
3122 : : }
3123 : :
3124 : : static bool origArc(const Arc& e) {
3125 : : return e._item.firstState();
3126 : : }
3127 : :
3128 : : static bool bindArc(const Arc& e) {
3129 : : return e._item.secondState();
3130 : : }
3131 : :
3132 : : static Node inNode(const DigraphNode& n) {
3133 : : return Node(n, true);
3134 : : }
3135 : :
3136 : : static Node outNode(const DigraphNode& n) {
3137 : : return Node(n, false);
3138 : : }
3139 : :
3140 : : static Arc arc(const DigraphNode& n) {
3141 : : return Arc(n);
3142 : : }
3143 : :
3144 : : static Arc arc(const DigraphArc& e) {
3145 : : return Arc(e);
3146 : : }
3147 : :
3148 : : typedef True NodeNumTag;
3149 : : int nodeNum() const {
3150 : : return 2 * countNodes(*_digraph);
3151 : : }
3152 : :
3153 : : typedef True ArcNumTag;
3154 : : int arcNum() const {
3155 : : return countArcs(*_digraph) + countNodes(*_digraph);
3156 : : }
3157 : :
3158 : : typedef True FindArcTag;
3159 : : Arc findArc(const Node& u, const Node& v,
3160 : : const Arc& prev = INVALID) const {
3161 : : if (inNode(u) && outNode(v)) {
3162 : : if (static_cast<const DigraphNode&>(u) ==
3163 : : static_cast<const DigraphNode&>(v) && prev == INVALID) {
3164 : : return Arc(u);
3165 : : }
3166 : : }
3167 : : else if (outNode(u) && inNode(v)) {
3168 : : return Arc(::lemon::findArc(*_digraph, u, v, prev));
3169 : : }
3170 : : return INVALID;
3171 : : }
3172 : :
3173 : : private:
3174 : :
3175 : : template <typename V>
3176 : : class NodeMapBase
3177 : : : public MapTraits<typename Parent::template NodeMap<V> > {
3178 : : typedef typename Parent::template NodeMap<V> NodeImpl;
3179 : : public:
3180 : : typedef Node Key;
3181 : : typedef V Value;
3182 : : typedef typename MapTraits<NodeImpl>::ReferenceMapTag ReferenceMapTag;
3183 : : typedef typename MapTraits<NodeImpl>::ReturnValue ReturnValue;
3184 : : typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReturnValue;
3185 : : typedef typename MapTraits<NodeImpl>::ReturnValue Reference;
3186 : : typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReference;
3187 : :
3188 : : NodeMapBase(const SplitNodesBase<DGR>& adaptor)
3189 : : : _in_map(*adaptor._digraph), _out_map(*adaptor._digraph) {}
3190 : : NodeMapBase(const SplitNodesBase<DGR>& adaptor, const V& value)
3191 : : : _in_map(*adaptor._digraph, value),
3192 : : _out_map(*adaptor._digraph, value) {}
3193 : :
3194 : : void set(const Node& key, const V& val) {
3195 : : if (SplitNodesBase<DGR>::inNode(key)) { _in_map.set(key, val); }
3196 : : else {_out_map.set(key, val); }
3197 : : }
3198 : :
3199 : : ReturnValue operator[](const Node& key) {
3200 : : if (SplitNodesBase<DGR>::inNode(key)) { return _in_map[key]; }
3201 : : else { return _out_map[key]; }
3202 : : }
3203 : :
3204 : : ConstReturnValue operator[](const Node& key) const {
3205 : : if (Adaptor::inNode(key)) { return _in_map[key]; }
3206 : : else { return _out_map[key]; }
3207 : : }
3208 : :
3209 : : private:
3210 : : NodeImpl _in_map, _out_map;
3211 : : };
3212 : :
3213 : : template <typename V>
3214 : : class ArcMapBase
3215 : : : public MapTraits<typename Parent::template ArcMap<V> > {
3216 : : typedef typename Parent::template ArcMap<V> ArcImpl;
3217 : : typedef typename Parent::template NodeMap<V> NodeImpl;
3218 : : public:
3219 : : typedef Arc Key;
3220 : : typedef V Value;
3221 : : typedef typename MapTraits<ArcImpl>::ReferenceMapTag ReferenceMapTag;
3222 : : typedef typename MapTraits<ArcImpl>::ReturnValue ReturnValue;
3223 : : typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReturnValue;
3224 : : typedef typename MapTraits<ArcImpl>::ReturnValue Reference;
3225 : : typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReference;
3226 : :
3227 : : ArcMapBase(const SplitNodesBase<DGR>& adaptor)
3228 : : : _arc_map(*adaptor._digraph), _node_map(*adaptor._digraph) {}
3229 : : ArcMapBase(const SplitNodesBase<DGR>& adaptor, const V& value)
3230 : : : _arc_map(*adaptor._digraph, value),
3231 : : _node_map(*adaptor._digraph, value) {}
3232 : :
3233 : : void set(const Arc& key, const V& val) {
3234 : : if (SplitNodesBase<DGR>::origArc(key)) {
3235 : : _arc_map.set(static_cast<const DigraphArc&>(key), val);
3236 : : } else {
3237 : : _node_map.set(static_cast<const DigraphNode&>(key), val);
3238 : : }
3239 : : }
3240 : :
3241 : : ReturnValue operator[](const Arc& key) {
3242 : : if (SplitNodesBase<DGR>::origArc(key)) {
3243 : : return _arc_map[static_cast<const DigraphArc&>(key)];
3244 : : } else {
3245 : : return _node_map[static_cast<const DigraphNode&>(key)];
3246 : : }
3247 : : }
3248 : :
3249 : : ConstReturnValue operator[](const Arc& key) const {
3250 : : if (SplitNodesBase<DGR>::origArc(key)) {
3251 : : return _arc_map[static_cast<const DigraphArc&>(key)];
3252 : : } else {
3253 : : return _node_map[static_cast<const DigraphNode&>(key)];
3254 : : }
3255 : : }
3256 : :
3257 : : private:
3258 : : ArcImpl _arc_map;
3259 : : NodeImpl _node_map;
3260 : : };
3261 : :
3262 : : public:
3263 : :
3264 : : template <typename V>
3265 : : class NodeMap
3266 : : : public SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<V> > {
3267 : : typedef SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<V> > Parent;
3268 : :
3269 : : public:
3270 : : typedef V Value;
3271 : :
3272 : : NodeMap(const SplitNodesBase<DGR>& adaptor)
3273 : : : Parent(adaptor) {}
3274 : :
3275 : : NodeMap(const SplitNodesBase<DGR>& adaptor, const V& value)
3276 : : : Parent(adaptor, value) {}
3277 : :
3278 : : private:
3279 : : NodeMap& operator=(const NodeMap& cmap) {
3280 : : return operator=<NodeMap>(cmap);
3281 : : }
3282 : :
3283 : : template <typename CMap>
3284 : : NodeMap& operator=(const CMap& cmap) {
3285 : : Parent::operator=(cmap);
3286 : : return *this;
3287 : : }
3288 : : };
3289 : :
3290 : : template <typename V>
3291 : : class ArcMap
3292 : : : public SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<V> > {
3293 : : typedef SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<V> > Parent;
3294 : :
3295 : : public:
3296 : : typedef V Value;
3297 : :
3298 : : ArcMap(const SplitNodesBase<DGR>& adaptor)
3299 : : : Parent(adaptor) {}
3300 : :
3301 : : ArcMap(const SplitNodesBase<DGR>& adaptor, const V& value)
3302 : : : Parent(adaptor, value) {}
3303 : :
3304 : : private:
3305 : : ArcMap& operator=(const ArcMap& cmap) {
3306 : : return operator=<ArcMap>(cmap);
3307 : : }
3308 : :
3309 : : template <typename CMap>
3310 : : ArcMap& operator=(const CMap& cmap) {
3311 : : Parent::operator=(cmap);
3312 : : return *this;
3313 : : }
3314 : : };
3315 : :
3316 : : protected:
3317 : :
3318 : : SplitNodesBase() : _digraph(0) {}
3319 : :
3320 : : DGR* _digraph;
3321 : :
3322 : : void initialize(Digraph& digraph) {
3323 : : _digraph = &digraph;
3324 : : }
3325 : :
3326 : : };
3327 : :
3328 : : /// \ingroup graph_adaptors
3329 : : ///
3330 : : /// \brief Adaptor class for splitting the nodes of a digraph.
3331 : : ///
3332 : : /// SplitNodes adaptor can be used for splitting each node into an
3333 : : /// \e in-node and an \e out-node in a digraph. Formaly, the adaptor
3334 : : /// replaces each node \f$ u \f$ in the digraph with two nodes,
3335 : : /// namely node \f$ u_{in} \f$ and node \f$ u_{out} \f$.
3336 : : /// If there is a \f$ (v, u) \f$ arc in the original digraph, then the
3337 : : /// new target of the arc will be \f$ u_{in} \f$ and similarly the
3338 : : /// source of each original \f$ (u, v) \f$ arc will be \f$ u_{out} \f$.
3339 : : /// The adaptor adds an additional \e bind \e arc from \f$ u_{in} \f$
3340 : : /// to \f$ u_{out} \f$ for each node \f$ u \f$ of the original digraph.
3341 : : ///
3342 : : /// The aim of this class is running an algorithm with respect to node
3343 : : /// costs or capacities if the algorithm considers only arc costs or
3344 : : /// capacities directly.
3345 : : /// In this case you can use \c SplitNodes adaptor, and set the node
3346 : : /// costs/capacities of the original digraph to the \e bind \e arcs
3347 : : /// in the adaptor.
3348 : : ///
3349 : : /// This class provides item counting in the same time as the adapted
3350 : : /// digraph structure.
3351 : : ///
3352 : : /// \tparam DGR The type of the adapted digraph.
3353 : : /// It must conform to the \ref concepts::Digraph "Digraph" concept.
3354 : : /// It is implicitly \c const.
3355 : : ///
3356 : : /// \note The \c Node type of this adaptor is converible to the \c Node
3357 : : /// type of the adapted digraph.
3358 : : template <typename DGR>
3359 : : #ifdef DOXYGEN
3360 : : class SplitNodes {
3361 : : #else
3362 : : class SplitNodes
3363 : : : public DigraphAdaptorExtender<SplitNodesBase<const DGR> > {
3364 : : #endif
3365 : : typedef DigraphAdaptorExtender<SplitNodesBase<const DGR> > Parent;
3366 : :
3367 : : public:
3368 : : typedef DGR Digraph;
3369 : :
3370 : : typedef typename DGR::Node DigraphNode;
3371 : : typedef typename DGR::Arc DigraphArc;
3372 : :
3373 : : typedef typename Parent::Node Node;
3374 : : typedef typename Parent::Arc Arc;
3375 : :
3376 : : /// \brief Constructor
3377 : : ///
3378 : : /// Constructor of the adaptor.
3379 : : SplitNodes(const DGR& g) {
3380 : : Parent::initialize(g);
3381 : : }
3382 : :
3383 : : /// \brief Returns \c true if the given node is an in-node.
3384 : : ///
3385 : : /// Returns \c true if the given node is an in-node.
3386 : : static bool inNode(const Node& n) {
3387 : : return Parent::inNode(n);
3388 : : }
3389 : :
3390 : : /// \brief Returns \c true if the given node is an out-node.
3391 : : ///
3392 : : /// Returns \c true if the given node is an out-node.
3393 : : static bool outNode(const Node& n) {
3394 : : return Parent::outNode(n);
3395 : : }
3396 : :
3397 : : /// \brief Returns \c true if the given arc is an original arc.
3398 : : ///
3399 : : /// Returns \c true if the given arc is one of the arcs in the
3400 : : /// original digraph.
3401 : : static bool origArc(const Arc& a) {
3402 : : return Parent::origArc(a);
3403 : : }
3404 : :
3405 : : /// \brief Returns \c true if the given arc is a bind arc.
3406 : : ///
3407 : : /// Returns \c true if the given arc is a bind arc, i.e. it connects
3408 : : /// an in-node and an out-node.
3409 : : static bool bindArc(const Arc& a) {
3410 : : return Parent::bindArc(a);
3411 : : }
3412 : :
3413 : : /// \brief Returns the in-node created from the given original node.
3414 : : ///
3415 : : /// Returns the in-node created from the given original node.
3416 : : static Node inNode(const DigraphNode& n) {
3417 : : return Parent::inNode(n);
3418 : : }
3419 : :
3420 : : /// \brief Returns the out-node created from the given original node.
3421 : : ///
3422 : : /// Returns the out-node created from the given original node.
3423 : : static Node outNode(const DigraphNode& n) {
3424 : : return Parent::outNode(n);
3425 : : }
3426 : :
3427 : : /// \brief Returns the bind arc that corresponds to the given
3428 : : /// original node.
3429 : : ///
3430 : : /// Returns the bind arc in the adaptor that corresponds to the given
3431 : : /// original node, i.e. the arc connecting the in-node and out-node
3432 : : /// of \c n.
3433 : : static Arc arc(const DigraphNode& n) {
3434 : : return Parent::arc(n);
3435 : : }
3436 : :
3437 : : /// \brief Returns the arc that corresponds to the given original arc.
3438 : : ///
3439 : : /// Returns the arc in the adaptor that corresponds to the given
3440 : : /// original arc.
3441 : : static Arc arc(const DigraphArc& a) {
3442 : : return Parent::arc(a);
3443 : : }
3444 : :
3445 : : /// \brief Node map combined from two original node maps
3446 : : ///
3447 : : /// This map adaptor class adapts two node maps of the original digraph
3448 : : /// to get a node map of the split digraph.
3449 : : /// Its value type is inherited from the first node map type (\c IN).
3450 : : /// \tparam IN The type of the node map for the in-nodes.
3451 : : /// \tparam OUT The type of the node map for the out-nodes.
3452 : : template <typename IN, typename OUT>
3453 : : class CombinedNodeMap {
3454 : : public:
3455 : :
3456 : : /// The key type of the map
3457 : : typedef Node Key;
3458 : : /// The value type of the map
3459 : : typedef typename IN::Value Value;
3460 : :
3461 : : typedef typename MapTraits<IN>::ReferenceMapTag ReferenceMapTag;
3462 : : typedef typename MapTraits<IN>::ReturnValue ReturnValue;
3463 : : typedef typename MapTraits<IN>::ConstReturnValue ConstReturnValue;
3464 : : typedef typename MapTraits<IN>::ReturnValue Reference;
3465 : : typedef typename MapTraits<IN>::ConstReturnValue ConstReference;
3466 : :
3467 : : /// Constructor
3468 : : CombinedNodeMap(IN& in_map, OUT& out_map)
3469 : : : _in_map(in_map), _out_map(out_map) {}
3470 : :
3471 : : /// Returns the value associated with the given key.
3472 : : Value operator[](const Key& key) const {
3473 : : if (SplitNodesBase<const DGR>::inNode(key)) {
3474 : : return _in_map[key];
3475 : : } else {
3476 : : return _out_map[key];
3477 : : }
3478 : : }
3479 : :
3480 : : /// Returns a reference to the value associated with the given key.
3481 : : Value& operator[](const Key& key) {
3482 : : if (SplitNodesBase<const DGR>::inNode(key)) {
3483 : : return _in_map[key];
3484 : : } else {
3485 : : return _out_map[key];
3486 : : }
3487 : : }
3488 : :
3489 : : /// Sets the value associated with the given key.
3490 : : void set(const Key& key, const Value& value) {
3491 : : if (SplitNodesBase<const DGR>::inNode(key)) {
3492 : : _in_map.set(key, value);
3493 : : } else {
3494 : : _out_map.set(key, value);
3495 : : }
3496 : : }
3497 : :
3498 : : private:
3499 : :
3500 : : IN& _in_map;
3501 : : OUT& _out_map;
3502 : :
3503 : : };
3504 : :
3505 : :
3506 : : /// \brief Returns a combined node map
3507 : : ///
3508 : : /// This function just returns a combined node map.
3509 : : template <typename IN, typename OUT>
3510 : : static CombinedNodeMap<IN, OUT>
3511 : : combinedNodeMap(IN& in_map, OUT& out_map) {
3512 : : return CombinedNodeMap<IN, OUT>(in_map, out_map);
3513 : : }
3514 : :
3515 : : template <typename IN, typename OUT>
3516 : : static CombinedNodeMap<const IN, OUT>
3517 : : combinedNodeMap(const IN& in_map, OUT& out_map) {
3518 : : return CombinedNodeMap<const IN, OUT>(in_map, out_map);
3519 : : }
3520 : :
3521 : : template <typename IN, typename OUT>
3522 : : static CombinedNodeMap<IN, const OUT>
3523 : : combinedNodeMap(IN& in_map, const OUT& out_map) {
3524 : : return CombinedNodeMap<IN, const OUT>(in_map, out_map);
3525 : : }
3526 : :
3527 : : template <typename IN, typename OUT>
3528 : : static CombinedNodeMap<const IN, const OUT>
3529 : : combinedNodeMap(const IN& in_map, const OUT& out_map) {
3530 : : return CombinedNodeMap<const IN, const OUT>(in_map, out_map);
3531 : : }
3532 : :
3533 : : /// \brief Arc map combined from an arc map and a node map of the
3534 : : /// original digraph.
3535 : : ///
3536 : : /// This map adaptor class adapts an arc map and a node map of the
3537 : : /// original digraph to get an arc map of the split digraph.
3538 : : /// Its value type is inherited from the original arc map type (\c AM).
3539 : : /// \tparam AM The type of the arc map.
3540 : : /// \tparam NM the type of the node map.
3541 : : template <typename AM, typename NM>
3542 : : class CombinedArcMap {
3543 : : public:
3544 : :
3545 : : /// The key type of the map
3546 : : typedef Arc Key;
3547 : : /// The value type of the map
3548 : : typedef typename AM::Value Value;
3549 : :
3550 : : typedef typename MapTraits<AM>::ReferenceMapTag ReferenceMapTag;
3551 : : typedef typename MapTraits<AM>::ReturnValue ReturnValue;
3552 : : typedef typename MapTraits<AM>::ConstReturnValue ConstReturnValue;
3553 : : typedef typename MapTraits<AM>::ReturnValue Reference;
3554 : : typedef typename MapTraits<AM>::ConstReturnValue ConstReference;
3555 : :
3556 : : /// Constructor
3557 : : CombinedArcMap(AM& arc_map, NM& node_map)
3558 : : : _arc_map(arc_map), _node_map(node_map) {}
3559 : :
3560 : : /// Returns the value associated with the given key.
3561 : : Value operator[](const Key& arc) const {
3562 : : if (SplitNodesBase<const DGR>::origArc(arc)) {
3563 : : return _arc_map[arc];
3564 : : } else {
3565 : : return _node_map[arc];
3566 : : }
3567 : : }
3568 : :
3569 : : /// Returns a reference to the value associated with the given key.
3570 : : Value& operator[](const Key& arc) {
3571 : : if (SplitNodesBase<const DGR>::origArc(arc)) {
3572 : : return _arc_map[arc];
3573 : : } else {
3574 : : return _node_map[arc];
3575 : : }
3576 : : }
3577 : :
3578 : : /// Sets the value associated with the given key.
3579 : : void set(const Arc& arc, const Value& val) {
3580 : : if (SplitNodesBase<const DGR>::origArc(arc)) {
3581 : : _arc_map.set(arc, val);
3582 : : } else {
3583 : : _node_map.set(arc, val);
3584 : : }
3585 : : }
3586 : :
3587 : : private:
3588 : :
3589 : : AM& _arc_map;
3590 : : NM& _node_map;
3591 : :
3592 : : };
3593 : :
3594 : : /// \brief Returns a combined arc map
3595 : : ///
3596 : : /// This function just returns a combined arc map.
3597 : : template <typename ArcMap, typename NodeMap>
3598 : : static CombinedArcMap<ArcMap, NodeMap>
3599 : : combinedArcMap(ArcMap& arc_map, NodeMap& node_map) {
3600 : : return CombinedArcMap<ArcMap, NodeMap>(arc_map, node_map);
3601 : : }
3602 : :
3603 : : template <typename ArcMap, typename NodeMap>
3604 : : static CombinedArcMap<const ArcMap, NodeMap>
3605 : : combinedArcMap(const ArcMap& arc_map, NodeMap& node_map) {
3606 : : return CombinedArcMap<const ArcMap, NodeMap>(arc_map, node_map);
3607 : : }
3608 : :
3609 : : template <typename ArcMap, typename NodeMap>
3610 : : static CombinedArcMap<ArcMap, const NodeMap>
3611 : : combinedArcMap(ArcMap& arc_map, const NodeMap& node_map) {
3612 : : return CombinedArcMap<ArcMap, const NodeMap>(arc_map, node_map);
3613 : : }
3614 : :
3615 : : template <typename ArcMap, typename NodeMap>
3616 : : static CombinedArcMap<const ArcMap, const NodeMap>
3617 : : combinedArcMap(const ArcMap& arc_map, const NodeMap& node_map) {
3618 : : return CombinedArcMap<const ArcMap, const NodeMap>(arc_map, node_map);
3619 : : }
3620 : :
3621 : : };
3622 : :
3623 : : /// \brief Returns a (read-only) SplitNodes adaptor
3624 : : ///
3625 : : /// This function just returns a (read-only) \ref SplitNodes adaptor.
3626 : : /// \ingroup graph_adaptors
3627 : : /// \relates SplitNodes
3628 : : template<typename DGR>
3629 : : SplitNodes<DGR>
3630 : : splitNodes(const DGR& digraph) {
3631 : : return SplitNodes<DGR>(digraph);
3632 : : }
3633 : :
3634 : : #undef LEMON_SCOPE_FIX
3635 : :
3636 : : } //namespace lemon
3637 : :
3638 : : #endif //LEMON_ADAPTORS_H
|