COIN-OR::LEMON - Graph Library

source: lemon/lemon/digraph_adaptor.h @ 430:05357da973ce

Last change on this file since 430:05357da973ce was 430:05357da973ce, checked in by Balazs Dezso <deba@…>, 11 years ago

Port graph adaptors from svn -r3498 (#67)

File size: 74.9 KB
Line 
1/* -*- C++ -*-
2 *
3 * This file is a part of LEMON, a generic C++ optimization library
4 *
5 * Copyright (C) 2003-2008
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 *
9 * Permission to use, modify and distribute this software is granted
10 * provided that this copyright notice appears in all copies. For
11 * precise terms see the accompanying LICENSE file.
12 *
13 * This software is provided "AS IS" with no warranty of any kind,
14 * express or implied, and with no claim as to its suitability for any
15 * purpose.
16 *
17 */
18
19#ifndef LEMON_DIGRAPH_ADAPTOR_H
20#define LEMON_DIGRAPH_ADAPTOR_H
21
22///\ingroup graph_adaptors
23///\file
24///\brief Several digraph adaptors.
25///
26///This file contains several useful digraph adaptor functions.
27
28#include <lemon/core.h>
29#include <lemon/maps.h>
30#include <lemon/bits/variant.h>
31
32#include <lemon/bits/base_extender.h>
33#include <lemon/bits/graph_adaptor_extender.h>
34#include <lemon/bits/graph_extender.h>
35#include <lemon/tolerance.h>
36
37#include <algorithm>
38
39namespace lemon {
40
41  ///\brief Base type for the Digraph Adaptors
42  ///
43  ///Base type for the Digraph Adaptors
44  ///
45  ///This is the base type for most of LEMON digraph adaptors. This
46  ///class implements a trivial digraph adaptor i.e. it only wraps the
47  ///functions and types of the digraph. The purpose of this class is
48  ///to make easier implementing digraph adaptors. E.g. if an adaptor
49  ///is considered which differs from the wrapped digraph only in some
50  ///of its functions or types, then it can be derived from
51  ///DigraphAdaptor, and only the differences should be implemented.
52  template<typename _Digraph>
53  class DigraphAdaptorBase {
54  public:
55    typedef _Digraph Digraph;
56    typedef DigraphAdaptorBase Adaptor;
57    typedef Digraph ParentDigraph;
58
59  protected:
60    Digraph* _digraph;
61    DigraphAdaptorBase() : _digraph(0) { }
62    void setDigraph(Digraph& digraph) { _digraph = &digraph; }
63
64  public:
65    DigraphAdaptorBase(Digraph& digraph) : _digraph(&digraph) { }
66
67    typedef typename Digraph::Node Node;
68    typedef typename Digraph::Arc Arc;
69   
70    void first(Node& i) const { _digraph->first(i); }
71    void first(Arc& i) const { _digraph->first(i); }
72    void firstIn(Arc& i, const Node& n) const { _digraph->firstIn(i, n); }
73    void firstOut(Arc& i, const Node& n ) const { _digraph->firstOut(i, n); }
74
75    void next(Node& i) const { _digraph->next(i); }
76    void next(Arc& i) const { _digraph->next(i); }
77    void nextIn(Arc& i) const { _digraph->nextIn(i); }
78    void nextOut(Arc& i) const { _digraph->nextOut(i); }
79
80    Node source(const Arc& a) const { return _digraph->source(a); }
81    Node target(const Arc& a) const { return _digraph->target(a); }
82
83    typedef NodeNumTagIndicator<Digraph> NodeNumTag;
84    int nodeNum() const { return _digraph->nodeNum(); }
85   
86    typedef EdgeNumTagIndicator<Digraph> EdgeNumTag;
87    int arcNum() const { return _digraph->arcNum(); }
88
89    typedef FindEdgeTagIndicator<Digraph> FindEdgeTag;
90    Arc findArc(const Node& u, const Node& v, const Arc& prev = INVALID) {
91      return _digraph->findArc(u, v, prev);
92    }
93 
94    Node addNode() { return _digraph->addNode(); }
95    Arc addArc(const Node& u, const Node& v) { return _digraph->addArc(u, v); }
96
97    void erase(const Node& n) const { _digraph->erase(n); }
98    void erase(const Arc& a) const { _digraph->erase(a); }
99 
100    void clear() const { _digraph->clear(); }
101   
102    int id(const Node& n) const { return _digraph->id(n); }
103    int id(const Arc& a) const { return _digraph->id(a); }
104
105    Node nodeFromId(int ix) const { return _digraph->nodeFromId(ix); }
106    Arc arcFromId(int ix) const { return _digraph->arcFromId(ix); }
107
108    int maxNodeId() const { return _digraph->maxNodeId(); }
109    int maxArcId() const { return _digraph->maxArcId(); }
110
111    typedef typename ItemSetTraits<Digraph, Node>::ItemNotifier NodeNotifier;
112    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
113
114    typedef typename ItemSetTraits<Digraph, Arc>::ItemNotifier ArcNotifier;
115    ArcNotifier& notifier(Arc) const { return _digraph->notifier(Arc()); }
116   
117    template <typename _Value>
118    class NodeMap : public Digraph::template NodeMap<_Value> {
119    public:
120
121      typedef typename Digraph::template NodeMap<_Value> Parent;
122
123      explicit NodeMap(const Adaptor& adaptor)
124        : Parent(*adaptor._digraph) {}
125
126      NodeMap(const Adaptor& adaptor, const _Value& value)
127        : Parent(*adaptor._digraph, value) { }
128
129    private:
130      NodeMap& operator=(const NodeMap& cmap) {
131        return operator=<NodeMap>(cmap);
132      }
133
134      template <typename CMap>
135      NodeMap& operator=(const CMap& cmap) {
136        Parent::operator=(cmap);
137        return *this;
138      }
139     
140    };
141
142    template <typename _Value>
143    class ArcMap : public Digraph::template ArcMap<_Value> {
144    public:
145     
146      typedef typename Digraph::template ArcMap<_Value> Parent;
147     
148      explicit ArcMap(const Adaptor& adaptor)
149        : Parent(*adaptor._digraph) {}
150
151      ArcMap(const Adaptor& adaptor, const _Value& value)
152        : Parent(*adaptor._digraph, value) {}
153
154    private:
155      ArcMap& operator=(const ArcMap& cmap) {
156        return operator=<ArcMap>(cmap);
157      }
158
159      template <typename CMap>
160      ArcMap& operator=(const CMap& cmap) {
161        Parent::operator=(cmap);
162        return *this;
163      }
164
165    };
166
167  };
168
169  ///\ingroup graph_adaptors
170  ///
171  ///\brief Trivial Digraph Adaptor
172  ///
173  /// This class is an adaptor which does not change the adapted
174  /// digraph.  It can be used only to test the digraph adaptors.
175  template <typename _Digraph>
176  class DigraphAdaptor :
177    public DigraphAdaptorExtender<DigraphAdaptorBase<_Digraph> > {
178  public:
179    typedef _Digraph Digraph;
180    typedef DigraphAdaptorExtender<DigraphAdaptorBase<_Digraph> > Parent;
181  protected:
182    DigraphAdaptor() : Parent() { }
183
184  public:
185    explicit DigraphAdaptor(Digraph& digraph) { setDigraph(digraph); }
186  };
187
188  /// \brief Just gives back a digraph adaptor
189  ///
190  /// Just gives back a digraph adaptor which
191  /// should be provide original digraph
192  template<typename Digraph>
193  DigraphAdaptor<const Digraph>
194  digraphAdaptor(const Digraph& digraph) {
195    return DigraphAdaptor<const Digraph>(digraph);
196  }
197
198
199  template <typename _Digraph>
200  class RevDigraphAdaptorBase : public DigraphAdaptorBase<_Digraph> {
201  public:
202    typedef _Digraph Digraph;
203    typedef DigraphAdaptorBase<_Digraph> Parent;
204  protected:
205    RevDigraphAdaptorBase() : Parent() { }
206  public:
207    typedef typename Parent::Node Node;
208    typedef typename Parent::Arc Arc;
209
210    void firstIn(Arc& a, const Node& n) const { Parent::firstOut(a, n); }
211    void firstOut(Arc& a, const Node& n ) const { Parent::firstIn(a, n); }
212
213    void nextIn(Arc& a) const { Parent::nextOut(a); }
214    void nextOut(Arc& a) const { Parent::nextIn(a); }
215
216    Node source(const Arc& a) const { return Parent::target(a); }
217    Node target(const Arc& a) const { return Parent::source(a); }
218
219    typedef FindEdgeTagIndicator<Digraph> FindEdgeTag;
220    Arc findArc(const Node& u, const Node& v,
221                const Arc& prev = INVALID) {
222      return Parent::findArc(v, u, prev);
223    }
224
225  };
226   
227
228  ///\ingroup graph_adaptors
229  ///
230  ///\brief A digraph adaptor which reverses the orientation of the arcs.
231  ///
232  /// If \c g is defined as
233  ///\code
234  /// ListDigraph g;
235  ///\endcode
236  /// then
237  ///\code
238  /// RevDigraphAdaptor<ListDigraph> ga(g);
239  ///\endcode
240  /// implements the digraph obtained from \c g by
241  /// reversing the orientation of its arcs.
242  ///
243  /// A good example of using RevDigraphAdaptor is to decide that the
244  /// directed graph is wheter strongly connected or not. If from one
245  /// node each node is reachable and from each node is reachable this
246  /// node then and just then the digraph is strongly
247  /// connected. Instead of this condition we use a little bit
248  /// different. From one node each node ahould be reachable in the
249  /// digraph and in the reversed digraph. Now this condition can be
250  /// checked with the Dfs algorithm class and the RevDigraphAdaptor
251  /// algorithm class.
252  ///
253  /// And look at the code:
254  ///
255  ///\code
256  /// bool stronglyConnected(const Digraph& digraph) {
257  ///   if (NodeIt(digraph) == INVALID) return true;
258  ///   Dfs<Digraph> dfs(digraph);
259  ///   dfs.run(NodeIt(digraph));
260  ///   for (NodeIt it(digraph); it != INVALID; ++it) {
261  ///     if (!dfs.reached(it)) {
262  ///       return false;
263  ///     }
264  ///   }
265  ///   typedef RevDigraphAdaptor<const Digraph> RDigraph;
266  ///   RDigraph rdigraph(digraph);
267  ///   DfsVisit<RDigraph> rdfs(rdigraph);
268  ///   rdfs.run(NodeIt(digraph));
269  ///   for (NodeIt it(digraph); it != INVALID; ++it) {
270  ///     if (!rdfs.reached(it)) {
271  ///       return false;
272  ///     }
273  ///   }
274  ///   return true;
275  /// }
276  ///\endcode
277  template<typename _Digraph>
278  class RevDigraphAdaptor :
279    public DigraphAdaptorExtender<RevDigraphAdaptorBase<_Digraph> > {
280  public:
281    typedef _Digraph Digraph;
282    typedef DigraphAdaptorExtender<
283      RevDigraphAdaptorBase<_Digraph> > Parent;
284  protected:
285    RevDigraphAdaptor() { }
286  public:
287    explicit RevDigraphAdaptor(Digraph& digraph) {
288      Parent::setDigraph(digraph);
289    }
290  };
291
292  /// \brief Just gives back a reverse digraph adaptor
293  ///
294  /// Just gives back a reverse digraph adaptor
295  template<typename Digraph>
296  RevDigraphAdaptor<const Digraph>
297  revDigraphAdaptor(const Digraph& digraph) {
298    return RevDigraphAdaptor<const Digraph>(digraph);
299  }
300
301  template <typename _Digraph, typename _NodeFilterMap,
302            typename _ArcFilterMap, bool checked = true>
303  class SubDigraphAdaptorBase : public DigraphAdaptorBase<_Digraph> {
304  public:
305    typedef _Digraph Digraph;
306    typedef _NodeFilterMap NodeFilterMap;
307    typedef _ArcFilterMap ArcFilterMap;
308
309    typedef SubDigraphAdaptorBase Adaptor;
310    typedef DigraphAdaptorBase<_Digraph> Parent;
311  protected:
312    NodeFilterMap* _node_filter;
313    ArcFilterMap* _arc_filter;
314    SubDigraphAdaptorBase()
315      : Parent(), _node_filter(0), _arc_filter(0) { }
316
317    void setNodeFilterMap(NodeFilterMap& node_filter) {
318      _node_filter = &node_filter;
319    }
320    void setArcFilterMap(ArcFilterMap& arc_filter) {
321      _arc_filter = &arc_filter;
322    }
323
324  public:
325
326    typedef typename Parent::Node Node;
327    typedef typename Parent::Arc Arc;
328
329    void first(Node& i) const {
330      Parent::first(i);
331      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
332    }
333
334    void first(Arc& i) const {
335      Parent::first(i);
336      while (i != INVALID && (!(*_arc_filter)[i]
337             || !(*_node_filter)[Parent::source(i)]
338             || !(*_node_filter)[Parent::target(i)])) Parent::next(i);
339    }
340
341    void firstIn(Arc& i, const Node& n) const {
342      Parent::firstIn(i, n);
343      while (i != INVALID && (!(*_arc_filter)[i]
344             || !(*_node_filter)[Parent::source(i)])) Parent::nextIn(i);
345    }
346
347    void firstOut(Arc& i, const Node& n) const {
348      Parent::firstOut(i, n);
349      while (i != INVALID && (!(*_arc_filter)[i]
350             || !(*_node_filter)[Parent::target(i)])) Parent::nextOut(i);
351    }
352
353    void next(Node& i) const {
354      Parent::next(i);
355      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
356    }
357
358    void next(Arc& i) const {
359      Parent::next(i);
360      while (i != INVALID && (!(*_arc_filter)[i]
361             || !(*_node_filter)[Parent::source(i)]
362             || !(*_node_filter)[Parent::target(i)])) Parent::next(i);
363    }
364
365    void nextIn(Arc& i) const {
366      Parent::nextIn(i);
367      while (i != INVALID && (!(*_arc_filter)[i]
368             || !(*_node_filter)[Parent::source(i)])) Parent::nextIn(i);
369    }
370
371    void nextOut(Arc& i) const {
372      Parent::nextOut(i);
373      while (i != INVALID && (!(*_arc_filter)[i]
374             || !(*_node_filter)[Parent::target(i)])) Parent::nextOut(i);
375    }
376
377    ///\e
378
379    /// This function hides \c n in the digraph, i.e. the iteration
380    /// jumps over it. This is done by simply setting the value of \c n 
381    /// to be false in the corresponding node-map.
382    void hide(const Node& n) const { _node_filter->set(n, false); }
383
384    ///\e
385
386    /// This function hides \c a in the digraph, i.e. the iteration
387    /// jumps over it. This is done by simply setting the value of \c a
388    /// to be false in the corresponding arc-map.
389    void hide(const Arc& a) const { _arc_filter->set(a, false); }
390
391    ///\e
392
393    /// The value of \c n is set to be true in the node-map which stores
394    /// hide information. If \c n was hidden previuosly, then it is shown
395    /// again
396     void unHide(const Node& n) const { _node_filter->set(n, true); }
397
398    ///\e
399
400    /// The value of \c a is set to be true in the arc-map which stores
401    /// hide information. If \c a was hidden previuosly, then it is shown
402    /// again
403    void unHide(const Arc& a) const { _arc_filter->set(a, true); }
404
405    /// Returns true if \c n is hidden.
406   
407    ///\e
408    ///
409    bool hidden(const Node& n) const { return !(*_node_filter)[n]; }
410
411    /// Returns true if \c a is hidden.
412   
413    ///\e
414    ///
415    bool hidden(const Arc& a) const { return !(*_arc_filter)[a]; }
416
417    typedef False NodeNumTag;
418    typedef False EdgeNumTag;
419
420    typedef FindEdgeTagIndicator<Digraph> FindEdgeTag;
421    Arc findArc(const Node& source, const Node& target,
422                const Arc& prev = INVALID) {
423      if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
424        return INVALID;
425      }
426      Arc arc = Parent::findArc(source, target, prev);
427      while (arc != INVALID && !(*_arc_filter)[arc]) {
428        arc = Parent::findArc(source, target, arc);
429      }
430      return arc;
431    }
432
433    template <typename _Value>
434    class NodeMap : public SubMapExtender<Adaptor,
435        typename Parent::template NodeMap<_Value> > {
436    public:
437      typedef _Value Value;
438      typedef SubMapExtender<Adaptor, typename Parent::
439                             template NodeMap<Value> > MapParent;
440   
441      NodeMap(const Adaptor& adaptor)
442        : MapParent(adaptor) {}
443      NodeMap(const Adaptor& adaptor, const Value& value)
444        : MapParent(adaptor, value) {}
445   
446    private:
447      NodeMap& operator=(const NodeMap& cmap) {
448        return operator=<NodeMap>(cmap);
449      }
450   
451      template <typename CMap>
452      NodeMap& operator=(const CMap& cmap) {
453        MapParent::operator=(cmap);
454        return *this;
455      }
456    };
457
458    template <typename _Value>
459    class ArcMap : public SubMapExtender<Adaptor,
460        typename Parent::template ArcMap<_Value> > {
461    public:
462      typedef _Value Value;
463      typedef SubMapExtender<Adaptor, typename Parent::
464                             template ArcMap<Value> > MapParent;
465   
466      ArcMap(const Adaptor& adaptor)
467        : MapParent(adaptor) {}
468      ArcMap(const Adaptor& adaptor, const Value& value)
469        : MapParent(adaptor, value) {}
470   
471    private:
472      ArcMap& operator=(const ArcMap& cmap) {
473        return operator=<ArcMap>(cmap);
474      }
475   
476      template <typename CMap>
477      ArcMap& operator=(const CMap& cmap) {
478        MapParent::operator=(cmap);
479        return *this;
480      }
481    };
482
483  };
484
485  template <typename _Digraph, typename _NodeFilterMap, typename _ArcFilterMap>
486  class SubDigraphAdaptorBase<_Digraph, _NodeFilterMap, _ArcFilterMap, false>
487    : public DigraphAdaptorBase<_Digraph> {
488  public:
489    typedef _Digraph Digraph;
490    typedef _NodeFilterMap NodeFilterMap;
491    typedef _ArcFilterMap ArcFilterMap;
492
493    typedef SubDigraphAdaptorBase Adaptor;
494    typedef DigraphAdaptorBase<Digraph> Parent;
495  protected:
496    NodeFilterMap* _node_filter;
497    ArcFilterMap* _arc_filter;
498    SubDigraphAdaptorBase()
499      : Parent(), _node_filter(0), _arc_filter(0) { }
500
501    void setNodeFilterMap(NodeFilterMap& node_filter) {
502      _node_filter = &node_filter;
503    }
504    void setArcFilterMap(ArcFilterMap& arc_filter) {
505      _arc_filter = &arc_filter;
506    }
507
508  public:
509
510    typedef typename Parent::Node Node;
511    typedef typename Parent::Arc Arc;
512
513    void first(Node& i) const {
514      Parent::first(i);
515      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
516    }
517
518    void first(Arc& i) const {
519      Parent::first(i);
520      while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i);
521    }
522
523    void firstIn(Arc& i, const Node& n) const {
524      Parent::firstIn(i, n);
525      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i);
526    }
527
528    void firstOut(Arc& i, const Node& n) const {
529      Parent::firstOut(i, n);
530      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i);
531    }
532
533    void next(Node& i) const {
534      Parent::next(i);
535      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
536    }
537    void next(Arc& i) const {
538      Parent::next(i);
539      while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i);
540    }
541    void nextIn(Arc& i) const {
542      Parent::nextIn(i);
543      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i);
544    }
545
546    void nextOut(Arc& i) const {
547      Parent::nextOut(i);
548      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i);
549    }
550
551    ///\e
552
553    /// This function hides \c n in the digraph, i.e. the iteration
554    /// jumps over it. This is done by simply setting the value of \c n 
555    /// to be false in the corresponding node-map.
556    void hide(const Node& n) const { _node_filter->set(n, false); }
557
558    ///\e
559
560    /// This function hides \c e in the digraph, i.e. the iteration
561    /// jumps over it. This is done by simply setting the value of \c e 
562    /// to be false in the corresponding arc-map.
563    void hide(const Arc& e) const { _arc_filter->set(e, false); }
564
565    ///\e
566
567    /// The value of \c n is set to be true in the node-map which stores
568    /// hide information. If \c n was hidden previuosly, then it is shown
569    /// again
570     void unHide(const Node& n) const { _node_filter->set(n, true); }
571
572    ///\e
573
574    /// The value of \c e is set to be true in the arc-map which stores
575    /// hide information. If \c e was hidden previuosly, then it is shown
576    /// again
577    void unHide(const Arc& e) const { _arc_filter->set(e, true); }
578
579    /// Returns true if \c n is hidden.
580   
581    ///\e
582    ///
583    bool hidden(const Node& n) const { return !(*_node_filter)[n]; }
584
585    /// Returns true if \c n is hidden.
586   
587    ///\e
588    ///
589    bool hidden(const Arc& e) const { return !(*_arc_filter)[e]; }
590
591    typedef False NodeNumTag;
592    typedef False EdgeNumTag;
593
594    typedef FindEdgeTagIndicator<Digraph> FindEdgeTag;
595    Arc findArc(const Node& source, const Node& target,
596                  const Arc& prev = INVALID) {
597      if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
598        return INVALID;
599      }
600      Arc arc = Parent::findArc(source, target, prev);
601      while (arc != INVALID && !(*_arc_filter)[arc]) {
602        arc = Parent::findArc(source, target, arc);
603      }
604      return arc;
605    }
606
607    template <typename _Value>
608    class NodeMap : public SubMapExtender<Adaptor,
609        typename Parent::template NodeMap<_Value> > {
610    public:
611      typedef _Value Value;
612      typedef SubMapExtender<Adaptor, typename Parent::
613                             template NodeMap<Value> > MapParent;
614   
615      NodeMap(const Adaptor& adaptor)
616        : MapParent(adaptor) {}
617      NodeMap(const Adaptor& adaptor, const Value& value)
618        : MapParent(adaptor, value) {}
619   
620    private:
621      NodeMap& operator=(const NodeMap& cmap) {
622        return operator=<NodeMap>(cmap);
623      }
624   
625      template <typename CMap>
626      NodeMap& operator=(const CMap& cmap) {
627        MapParent::operator=(cmap);
628        return *this;
629      }
630    };
631
632    template <typename _Value>
633    class ArcMap : public SubMapExtender<Adaptor,
634        typename Parent::template ArcMap<_Value> > {
635    public:
636      typedef _Value Value;
637      typedef SubMapExtender<Adaptor, typename Parent::
638                             template ArcMap<Value> > MapParent;
639   
640      ArcMap(const Adaptor& adaptor)
641        : MapParent(adaptor) {}
642      ArcMap(const Adaptor& adaptor, const Value& value)
643        : MapParent(adaptor, value) {}
644   
645    private:
646      ArcMap& operator=(const ArcMap& cmap) {
647        return operator=<ArcMap>(cmap);
648      }
649   
650      template <typename CMap>
651      ArcMap& operator=(const CMap& cmap) {
652        MapParent::operator=(cmap);
653        return *this;
654      }
655    };
656
657  };
658
659  /// \ingroup graph_adaptors
660  ///
661  /// \brief A digraph adaptor for hiding nodes and arcs from a digraph.
662  ///
663  /// SubDigraphAdaptor shows the digraph with filtered node-set and
664  /// arc-set. If the \c checked parameter is true then it filters the arcset
665  /// to do not get invalid arcs without source or target.
666  /// Let \f$ G=(V, A) \f$ be a directed digraph
667  /// and suppose that the digraph instance \c g of type ListDigraph
668  /// implements \f$ G \f$.
669  /// Let moreover \f$ b_V \f$ and \f$ b_A \f$ be bool-valued functions resp.
670  /// on the node-set and arc-set.
671  /// SubDigraphAdaptor<...>::NodeIt iterates
672  /// on the node-set \f$ \{v\in V : b_V(v)=true\} \f$ and
673  /// SubDigraphAdaptor<...>::ArcIt iterates
674  /// on the arc-set \f$ \{e\in A : b_A(e)=true\} \f$. Similarly,
675  /// SubDigraphAdaptor<...>::OutArcIt and
676  /// SubDigraphAdaptor<...>::InArcIt iterates
677  /// only on arcs leaving and entering a specific node which have true value.
678  ///
679  /// If the \c checked template parameter is false then we have to
680  /// note that the node-iterator cares only the filter on the
681  /// node-set, and the arc-iterator cares only the filter on the
682  /// arc-set.  This way the arc-map should filter all arcs which's
683  /// source or target is filtered by the node-filter.
684  ///\code
685  /// typedef ListDigraph Digraph;
686  /// DIGRAPH_TYPEDEFS(Digraph);
687  /// Digraph g;
688  /// Node u=g.addNode(); //node of id 0
689  /// Node v=g.addNode(); //node of id 1
690  /// Arc a=g.addArc(u, v); //arc of id 0
691  /// Arc f=g.addArc(v, u); //arc of id 1
692  /// BoolNodeMap nm(g, true);
693  /// nm.set(u, false);
694  /// BoolArcMap am(g, true);
695  /// am.set(a, false);
696  /// typedef SubDigraphAdaptor<Digraph, BoolNodeMap, BoolArcMap> SubGA;
697  /// SubGA ga(g, nm, am);
698  /// for (SubGA::NodeIt n(ga); n!=INVALID; ++n)
699  ///   std::cout << g.id(n) << std::endl;
700  /// std::cout << ":-)" << std::endl;
701  /// for (SubGA::ArcIt a(ga); a!=INVALID; ++a)
702  ///   std::cout << g.id(a) << std::endl;
703  ///\endcode
704  /// The output of the above code is the following.
705  ///\code
706  /// 1
707  /// :-)
708  /// 1
709  ///\endcode
710  /// Note that \c n is of type \c SubGA::NodeIt, but it can be converted to
711  /// \c Digraph::Node that is why \c g.id(n) can be applied.
712  ///
713  /// For other examples see also the documentation of
714  /// NodeSubDigraphAdaptor and ArcSubDigraphAdaptor.
715  template<typename _Digraph,
716           typename _NodeFilterMap = typename _Digraph::template NodeMap<bool>,
717           typename _ArcFilterMap = typename _Digraph::template ArcMap<bool>,
718           bool checked = true>
719  class SubDigraphAdaptor :
720    public DigraphAdaptorExtender<
721    SubDigraphAdaptorBase<_Digraph, _NodeFilterMap, _ArcFilterMap, checked> > {
722  public:
723    typedef _Digraph Digraph;
724    typedef _NodeFilterMap NodeFilterMap;
725    typedef _ArcFilterMap ArcFilterMap;
726
727    typedef DigraphAdaptorExtender<
728      SubDigraphAdaptorBase<Digraph, NodeFilterMap, ArcFilterMap, checked> >
729    Parent;
730
731  protected:
732    SubDigraphAdaptor() { }
733  public:
734
735    SubDigraphAdaptor(Digraph& digraph, NodeFilterMap& node_filter,
736                      ArcFilterMap& arc_filter) {
737      setDigraph(digraph);
738      setNodeFilterMap(node_filter);
739      setArcFilterMap(arc_filter);
740    }
741
742  };
743
744  /// \brief Just gives back a sub digraph adaptor
745  ///
746  /// Just gives back a sub digraph adaptor
747  template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap>
748  SubDigraphAdaptor<const Digraph, NodeFilterMap, ArcFilterMap>
749  subDigraphAdaptor(const Digraph& digraph,
750                    NodeFilterMap& nfm, ArcFilterMap& afm) {
751    return SubDigraphAdaptor<const Digraph, NodeFilterMap, ArcFilterMap>
752      (digraph, nfm, afm);
753  }
754
755  template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap>
756  SubDigraphAdaptor<const Digraph, const NodeFilterMap, ArcFilterMap>
757  subDigraphAdaptor(const Digraph& digraph,
758                   NodeFilterMap& nfm, ArcFilterMap& afm) {
759    return SubDigraphAdaptor<const Digraph, const NodeFilterMap, ArcFilterMap>
760      (digraph, nfm, afm);
761  }
762
763  template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap>
764  SubDigraphAdaptor<const Digraph, NodeFilterMap, const ArcFilterMap>
765  subDigraphAdaptor(const Digraph& digraph,
766                   NodeFilterMap& nfm, ArcFilterMap& afm) {
767    return SubDigraphAdaptor<const Digraph, NodeFilterMap, const ArcFilterMap>
768      (digraph, nfm, afm);
769  }
770
771  template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap>
772  SubDigraphAdaptor<const Digraph, const NodeFilterMap, const ArcFilterMap>
773  subDigraphAdaptor(const Digraph& digraph,
774                   NodeFilterMap& nfm, ArcFilterMap& afm) {
775    return SubDigraphAdaptor<const Digraph, const NodeFilterMap,
776      const ArcFilterMap>(digraph, nfm, afm);
777  }
778
779
780
781  ///\ingroup graph_adaptors
782  ///
783  ///\brief An adaptor for hiding nodes from a digraph.
784  ///
785  ///An adaptor for hiding nodes from a digraph.  This adaptor
786  ///specializes SubDigraphAdaptor in the way that only the node-set
787  ///can be filtered. In usual case the checked parameter is true, we
788  ///get the induced subgraph. But if the checked parameter is false
789  ///then we can filter only isolated nodes.
790  template<typename _Digraph,
791           typename _NodeFilterMap = typename _Digraph::template NodeMap<bool>,
792           bool checked = true>
793  class NodeSubDigraphAdaptor :
794    public SubDigraphAdaptor<_Digraph, _NodeFilterMap,
795                             ConstMap<typename _Digraph::Arc, bool>, checked> {
796  public:
797
798    typedef _Digraph Digraph;
799    typedef _NodeFilterMap NodeFilterMap;
800
801    typedef SubDigraphAdaptor<Digraph, NodeFilterMap,
802                              ConstMap<typename Digraph::Arc, bool>, checked>
803    Parent;
804
805  protected:
806    ConstMap<typename Digraph::Arc, bool> const_true_map;
807
808    NodeSubDigraphAdaptor() : const_true_map(true) {
809      Parent::setArcFilterMap(const_true_map);
810    }
811
812  public:
813
814    NodeSubDigraphAdaptor(Digraph& _digraph, NodeFilterMap& node_filter) :
815      Parent(), const_true_map(true) {
816      Parent::setDigraph(_digraph);
817      Parent::setNodeFilterMap(node_filter);
818      Parent::setArcFilterMap(const_true_map);
819    }
820
821  };
822
823
824  /// \brief Just gives back a \c NodeSubDigraphAdaptor
825  ///
826  /// Just gives back a \c NodeSubDigraphAdaptor
827  template<typename Digraph, typename NodeFilterMap>
828  NodeSubDigraphAdaptor<const Digraph, NodeFilterMap>
829  nodeSubDigraphAdaptor(const Digraph& digraph, NodeFilterMap& nfm) {
830    return NodeSubDigraphAdaptor<const Digraph, NodeFilterMap>(digraph, nfm);
831  }
832
833  template<typename Digraph, typename NodeFilterMap>
834  NodeSubDigraphAdaptor<const Digraph, const NodeFilterMap>
835  nodeSubDigraphAdaptor(const Digraph& digraph, const NodeFilterMap& nfm) {
836    return NodeSubDigraphAdaptor<const Digraph, const NodeFilterMap>
837      (digraph, nfm);
838  }
839
840  ///\ingroup graph_adaptors
841  ///
842  ///\brief An adaptor for hiding arcs from a digraph.
843  ///
844  ///An adaptor for hiding arcs from a digraph. This adaptor
845  ///specializes SubDigraphAdaptor in the way that only the arc-set
846  ///can be filtered. The usefulness of this adaptor is demonstrated
847  ///in the problem of searching a maximum number of arc-disjoint
848  ///shortest paths between two nodes \c s and \c t. Shortest here
849  ///means being shortest w.r.t.  non-negative arc-lengths. Note that
850  ///the comprehension of the presented solution need's some
851  ///elementary knowlarc from combinatorial optimization.
852  ///
853  ///If a single shortest path is to be searched between \c s and \c
854  ///t, then this can be done easily by applying the Dijkstra
855  ///algorithm. What happens, if a maximum number of arc-disjoint
856  ///shortest paths is to be computed. It can be proved that an arc
857  ///can be in a shortest path if and only if it is tight with respect
858  ///to the potential function computed by Dijkstra.  Moreover, any
859  ///path containing only such arcs is a shortest one.  Thus we have
860  ///to compute a maximum number of arc-disjoint paths between \c s
861  ///and \c t in the digraph which has arc-set all the tight arcs. The
862  ///computation will be demonstrated on the following digraph, which
863  ///is read from the dimacs file \c sub_digraph_adaptor_demo.dim.
864  ///The full source code is available in \ref
865  ///sub_digraph_adaptor_demo.cc.  If you are interested in more demo
866  ///programs, you can use \ref dim_to_dot.cc to generate .dot files
867  ///from dimacs files.  The .dot file of the following figure was
868  ///generated by the demo program \ref dim_to_dot.cc.
869  ///
870  ///\dot
871  ///didigraph lemon_dot_example {
872  ///node [ shape=ellipse, fontname=Helvetica, fontsize=10 ];
873  ///n0 [ label="0 (s)" ];
874  ///n1 [ label="1" ];
875  ///n2 [ label="2" ];
876  ///n3 [ label="3" ];
877  ///n4 [ label="4" ];
878  ///n5 [ label="5" ];
879  ///n6 [ label="6 (t)" ];
880  ///arc [ shape=ellipse, fontname=Helvetica, fontsize=10 ];
881  ///n5 ->  n6 [ label="9, length:4" ];
882  ///n4 ->  n6 [ label="8, length:2" ];
883  ///n3 ->  n5 [ label="7, length:1" ];
884  ///n2 ->  n5 [ label="6, length:3" ];
885  ///n2 ->  n6 [ label="5, length:5" ];
886  ///n2 ->  n4 [ label="4, length:2" ];
887  ///n1 ->  n4 [ label="3, length:3" ];
888  ///n0 ->  n3 [ label="2, length:1" ];
889  ///n0 ->  n2 [ label="1, length:2" ];
890  ///n0 ->  n1 [ label="0, length:3" ];
891  ///}
892  ///\enddot
893  ///
894  ///\code
895  ///Digraph g;
896  ///Node s, t;
897  ///LengthMap length(g);
898  ///
899  ///readDimacs(std::cin, g, length, s, t);
900  ///
901  ///cout << "arcs with lengths (of form id, source--length->target): " << endl;
902  ///for(ArcIt e(g); e!=INVALID; ++e)
903  ///  cout << g.id(e) << ", " << g.id(g.source(e)) << "--"
904  ///       << length[e] << "->" << g.id(g.target(e)) << endl;
905  ///
906  ///cout << "s: " << g.id(s) << " t: " << g.id(t) << endl;
907  ///\endcode
908  ///Next, the potential function is computed with Dijkstra.
909  ///\code
910  ///typedef Dijkstra<Digraph, LengthMap> Dijkstra;
911  ///Dijkstra dijkstra(g, length);
912  ///dijkstra.run(s);
913  ///\endcode
914  ///Next, we consrtruct a map which filters the arc-set to the tight arcs.
915  ///\code
916  ///typedef TightArcFilterMap<Digraph, const Dijkstra::DistMap, LengthMap>
917  ///  TightArcFilter;
918  ///TightArcFilter tight_arc_filter(g, dijkstra.distMap(), length);
919  ///
920  ///typedef ArcSubDigraphAdaptor<Digraph, TightArcFilter> SubGA;
921  ///SubGA ga(g, tight_arc_filter);
922  ///\endcode
923  ///Then, the maximum nimber of arc-disjoint \c s-\c t paths are computed
924  ///with a max flow algorithm Preflow.
925  ///\code
926  ///ConstMap<Arc, int> const_1_map(1);
927  ///Digraph::ArcMap<int> flow(g, 0);
928  ///
929  ///Preflow<SubGA, ConstMap<Arc, int>, Digraph::ArcMap<int> >
930  ///  preflow(ga, const_1_map, s, t);
931  ///preflow.run();
932  ///\endcode
933  ///Last, the output is:
934  ///\code 
935  ///cout << "maximum number of arc-disjoint shortest path: "
936  ///     << preflow.flowValue() << endl;
937  ///cout << "arcs of the maximum number of arc-disjoint shortest s-t paths: "
938  ///     << endl;
939  ///for(ArcIt e(g); e!=INVALID; ++e)
940  ///  if (preflow.flow(e))
941  ///    cout << " " << g.id(g.source(e)) << "--"
942  ///         << length[e] << "->" << g.id(g.target(e)) << endl;
943  ///\endcode
944  ///The program has the following (expected :-)) output:
945  ///\code
946  ///arcs with lengths (of form id, source--length->target):
947  /// 9, 5--4->6
948  /// 8, 4--2->6
949  /// 7, 3--1->5
950  /// 6, 2--3->5
951  /// 5, 2--5->6
952  /// 4, 2--2->4
953  /// 3, 1--3->4
954  /// 2, 0--1->3
955  /// 1, 0--2->2
956  /// 0, 0--3->1
957  ///s: 0 t: 6
958  ///maximum number of arc-disjoint shortest path: 2
959  ///arcs of the maximum number of arc-disjoint shortest s-t paths:
960  /// 9, 5--4->6
961  /// 8, 4--2->6
962  /// 7, 3--1->5
963  /// 4, 2--2->4
964  /// 2, 0--1->3
965  /// 1, 0--2->2
966  ///\endcode
967  template<typename _Digraph, typename _ArcFilterMap>
968  class ArcSubDigraphAdaptor :
969    public SubDigraphAdaptor<_Digraph, ConstMap<typename _Digraph::Node, bool>,
970                             _ArcFilterMap, false> {
971  public:
972    typedef _Digraph Digraph;
973    typedef _ArcFilterMap ArcFilterMap;
974
975    typedef SubDigraphAdaptor<Digraph, ConstMap<typename Digraph::Node, bool>,
976                              ArcFilterMap, false> Parent;
977  protected:
978    ConstMap<typename Digraph::Node, bool> const_true_map;
979
980    ArcSubDigraphAdaptor() : const_true_map(true) {
981      Parent::setNodeFilterMap(const_true_map);
982    }
983
984  public:
985
986    ArcSubDigraphAdaptor(Digraph& digraph, ArcFilterMap& arc_filter)
987      : Parent(), const_true_map(true) {
988      Parent::setDigraph(digraph);
989      Parent::setNodeFilterMap(const_true_map);
990      Parent::setArcFilterMap(arc_filter);
991    }
992
993  };
994
995  /// \brief Just gives back an arc sub digraph adaptor
996  ///
997  /// Just gives back an arc sub digraph adaptor
998  template<typename Digraph, typename ArcFilterMap>
999  ArcSubDigraphAdaptor<const Digraph, ArcFilterMap>
1000  arcSubDigraphAdaptor(const Digraph& digraph, ArcFilterMap& afm) {
1001    return ArcSubDigraphAdaptor<const Digraph, ArcFilterMap>(digraph, afm);
1002  }
1003
1004  template<typename Digraph, typename ArcFilterMap>
1005  ArcSubDigraphAdaptor<const Digraph, const ArcFilterMap>
1006  arcSubDigraphAdaptor(const Digraph& digraph, const ArcFilterMap& afm) {
1007    return ArcSubDigraphAdaptor<const Digraph, const ArcFilterMap>
1008      (digraph, afm);
1009  }
1010
1011  template <typename _Digraph>
1012  class UndirDigraphAdaptorBase {
1013  public:
1014    typedef _Digraph Digraph;
1015    typedef UndirDigraphAdaptorBase Adaptor;
1016
1017    typedef True UndirectedTag;
1018
1019    typedef typename Digraph::Arc Edge;
1020    typedef typename Digraph::Node Node;
1021
1022    class Arc : public Edge {
1023      friend class UndirDigraphAdaptorBase;
1024    protected:
1025      bool _forward;
1026
1027      Arc(const Edge& edge, bool forward) :
1028        Edge(edge), _forward(forward) {}
1029
1030    public:
1031      Arc() {}
1032
1033      Arc(Invalid) : Edge(INVALID), _forward(true) {}
1034
1035      bool operator==(const Arc &other) const {
1036        return _forward == other._forward &&
1037          static_cast<const Edge&>(*this) == static_cast<const Edge&>(other);
1038      }
1039      bool operator!=(const Arc &other) const {
1040        return _forward != other._forward ||
1041          static_cast<const Edge&>(*this) != static_cast<const Edge&>(other);
1042      }
1043      bool operator<(const Arc &other) const {
1044        return _forward < other._forward ||
1045          (_forward == other._forward &&
1046           static_cast<const Edge&>(*this) < static_cast<const Edge&>(other));
1047      }
1048    };
1049
1050
1051
1052    void first(Node& n) const {
1053      _digraph->first(n);
1054    }
1055
1056    void next(Node& n) const {
1057      _digraph->next(n);
1058    }
1059
1060    void first(Arc& a) const {
1061      _digraph->first(a);
1062      a._forward = true;
1063    }
1064
1065    void next(Arc& a) const {
1066      if (a._forward) {
1067        a._forward = false;
1068      } else {
1069        _digraph->next(a);
1070        a._forward = true;
1071      }
1072    }
1073
1074    void first(Edge& e) const {
1075      _digraph->first(e);
1076    }
1077
1078    void next(Edge& e) const {
1079      _digraph->next(e);
1080    }
1081
1082    void firstOut(Arc& a, const Node& n) const {
1083      _digraph->firstIn(a, n);
1084      if( static_cast<const Edge&>(a) != INVALID ) {
1085        a._forward = false;
1086      } else {
1087        _digraph->firstOut(a, n);
1088        a._forward = true;
1089      }
1090    }
1091    void nextOut(Arc &a) const {
1092      if (!a._forward) {
1093        Node n = _digraph->target(a);
1094        _digraph->nextIn(a);
1095        if (static_cast<const Edge&>(a) == INVALID ) {
1096          _digraph->firstOut(a, n);
1097          a._forward = true;
1098        }
1099      }
1100      else {
1101        _digraph->nextOut(a);
1102      }
1103    }
1104
1105    void firstIn(Arc &a, const Node &n) const {
1106      _digraph->firstOut(a, n);
1107      if (static_cast<const Edge&>(a) != INVALID ) {
1108        a._forward = false;
1109      } else {
1110        _digraph->firstIn(a, n);
1111        a._forward = true;
1112      }
1113    }
1114    void nextIn(Arc &a) const {
1115      if (!a._forward) {
1116        Node n = _digraph->source(a);
1117        _digraph->nextOut(a);
1118        if( static_cast<const Edge&>(a) == INVALID ) {
1119          _digraph->firstIn(a, n);
1120          a._forward = true;
1121        }
1122      }
1123      else {
1124        _digraph->nextIn(a);
1125      }
1126    }
1127
1128    void firstInc(Edge &e, bool &d, const Node &n) const {
1129      d = true;
1130      _digraph->firstOut(e, n);
1131      if (e != INVALID) return;
1132      d = false;
1133      _digraph->firstIn(e, n);
1134    }
1135
1136    void nextInc(Edge &e, bool &d) const {
1137      if (d) {
1138        Node s = _digraph->source(e);
1139        _digraph->nextOut(e);
1140        if (e != INVALID) return;
1141        d = false;
1142        _digraph->firstIn(e, s);
1143      } else {
1144        _digraph->nextIn(e);
1145      }
1146    }
1147
1148    Node u(const Edge& e) const {
1149      return _digraph->source(e);
1150    }
1151
1152    Node v(const Edge& e) const {
1153      return _digraph->target(e);
1154    }
1155
1156    Node source(const Arc &a) const {
1157      return a._forward ? _digraph->source(a) : _digraph->target(a);
1158    }
1159
1160    Node target(const Arc &a) const {
1161      return a._forward ? _digraph->target(a) : _digraph->source(a);
1162    }
1163
1164    static Arc direct(const Edge &e, bool d) {
1165      return Arc(e, d);
1166    }
1167    Arc direct(const Edge &e, const Node& n) const {
1168      return Arc(e, _digraph->source(e) == n);
1169    }
1170
1171    static bool direction(const Arc &a) { return a._forward; }
1172
1173    Node nodeFromId(int ix) const { return _digraph->nodeFromId(ix); }
1174    Arc arcFromId(int ix) const {
1175      return direct(_digraph->arcFromId(ix >> 1), bool(ix & 1));
1176    }
1177    Edge edgeFromId(int ix) const { return _digraph->arcFromId(ix); }
1178
1179    int id(const Node &n) const { return _digraph->id(n); }
1180    int id(const Arc &a) const {
1181      return  (_digraph->id(a) << 1) | (a._forward ? 1 : 0);
1182    }
1183    int id(const Edge &e) const { return _digraph->id(e); }
1184
1185    int maxNodeId() const { return _digraph->maxNodeId(); }
1186    int maxArcId() const { return (_digraph->maxArcId() << 1) | 1; }
1187    int maxEdgeId() const { return _digraph->maxArcId(); }
1188
1189    Node addNode() { return _digraph->addNode(); }
1190    Edge addEdge(const Node& u, const Node& v) {
1191      return _digraph->addArc(u, v);
1192    }
1193
1194    void erase(const Node& i) { _digraph->erase(i); }
1195    void erase(const Edge& i) { _digraph->erase(i); }
1196 
1197    void clear() { _digraph->clear(); }
1198
1199    typedef NodeNumTagIndicator<Digraph> NodeNumTag;
1200    int nodeNum() const { return 2 * _digraph->arcNum(); }
1201    typedef EdgeNumTagIndicator<Digraph> EdgeNumTag;
1202    int arcNum() const { return 2 * _digraph->arcNum(); }
1203    int edgeNum() const { return _digraph->arcNum(); }
1204
1205    typedef FindEdgeTagIndicator<Digraph> FindEdgeTag;
1206    Arc findArc(Node s, Node t, Arc p = INVALID) const {
1207      if (p == INVALID) {
1208        Edge arc = _digraph->findArc(s, t);
1209        if (arc != INVALID) return direct(arc, true);
1210        arc = _digraph->findArc(t, s);
1211        if (arc != INVALID) return direct(arc, false);
1212      } else if (direction(p)) {
1213        Edge arc = _digraph->findArc(s, t, p);
1214        if (arc != INVALID) return direct(arc, true);
1215        arc = _digraph->findArc(t, s);
1216        if (arc != INVALID) return direct(arc, false); 
1217      } else {
1218        Edge arc = _digraph->findArc(t, s, p);
1219        if (arc != INVALID) return direct(arc, false);       
1220      }
1221      return INVALID;
1222    }
1223
1224    Edge findEdge(Node s, Node t, Edge p = INVALID) const {
1225      if (s != t) {
1226        if (p == INVALID) {
1227          Edge arc = _digraph->findArc(s, t);
1228          if (arc != INVALID) return arc;
1229          arc = _digraph->findArc(t, s);
1230          if (arc != INVALID) return arc;
1231        } else if (_digraph->s(p) == s) {
1232          Edge arc = _digraph->findArc(s, t, p);
1233          if (arc != INVALID) return arc;
1234          arc = _digraph->findArc(t, s);
1235          if (arc != INVALID) return arc;       
1236        } else {
1237          Edge arc = _digraph->findArc(t, s, p);
1238          if (arc != INVALID) return arc;             
1239        }
1240      } else {
1241        return _digraph->findArc(s, t, p);
1242      }
1243      return INVALID;
1244    }
1245
1246  private:
1247   
1248    template <typename _Value>
1249    class ArcMapBase {
1250    private:
1251     
1252      typedef typename Digraph::template ArcMap<_Value> MapImpl;
1253     
1254    public:
1255
1256      typedef typename MapTraits<MapImpl>::ReferenceMapTag ReferenceMapTag;
1257
1258      typedef _Value Value;
1259      typedef Arc Key;
1260     
1261      ArcMapBase(const Adaptor& adaptor) :
1262        _forward(*adaptor._digraph), _backward(*adaptor._digraph) {}
1263
1264      ArcMapBase(const Adaptor& adaptor, const Value& v)
1265        : _forward(*adaptor._digraph, v), _backward(*adaptor._digraph, v) {}
1266     
1267      void set(const Arc& a, const Value& v) {
1268        if (direction(a)) {
1269          _forward.set(a, v);
1270        } else {
1271          _backward.set(a, v);
1272        }
1273      }
1274
1275      typename MapTraits<MapImpl>::ConstReturnValue
1276      operator[](const Arc& a) const {
1277        if (direction(a)) {
1278          return _forward[a];
1279        } else {
1280          return _backward[a];
1281        }
1282      }
1283
1284      typename MapTraits<MapImpl>::ReturnValue
1285      operator[](const Arc& a) {
1286        if (direction(a)) {
1287          return _forward[a];
1288        } else {
1289          return _backward[a];
1290        }
1291      }
1292
1293    protected:
1294
1295      MapImpl _forward, _backward;
1296
1297    };
1298
1299  public:
1300
1301    template <typename _Value>
1302    class NodeMap : public Digraph::template NodeMap<_Value> {
1303    public:
1304
1305      typedef _Value Value;
1306      typedef typename Digraph::template NodeMap<Value> Parent;
1307
1308      explicit NodeMap(const Adaptor& adaptor)
1309        : Parent(*adaptor._digraph) {}
1310
1311      NodeMap(const Adaptor& adaptor, const _Value& value)
1312        : Parent(*adaptor._digraph, value) { }
1313
1314    private:
1315      NodeMap& operator=(const NodeMap& cmap) {
1316        return operator=<NodeMap>(cmap);
1317      }
1318
1319      template <typename CMap>
1320      NodeMap& operator=(const CMap& cmap) {
1321        Parent::operator=(cmap);
1322        return *this;
1323      }
1324     
1325    };
1326
1327    template <typename _Value>
1328    class ArcMap
1329      : public SubMapExtender<Adaptor, ArcMapBase<_Value> >
1330    {
1331    public:
1332      typedef _Value Value;
1333      typedef SubMapExtender<Adaptor, ArcMapBase<Value> > Parent;
1334   
1335      ArcMap(const Adaptor& adaptor)
1336        : Parent(adaptor) {}
1337
1338      ArcMap(const Adaptor& adaptor, const Value& value)
1339        : Parent(adaptor, value) {}
1340   
1341    private:
1342      ArcMap& operator=(const ArcMap& cmap) {
1343        return operator=<ArcMap>(cmap);
1344      }
1345   
1346      template <typename CMap>
1347      ArcMap& operator=(const CMap& cmap) {
1348        Parent::operator=(cmap);
1349        return *this;
1350      }
1351    };
1352       
1353    template <typename _Value>
1354    class EdgeMap : public Digraph::template ArcMap<_Value> {
1355    public:
1356     
1357      typedef _Value Value;
1358      typedef typename Digraph::template ArcMap<Value> Parent;
1359     
1360      explicit EdgeMap(const Adaptor& adaptor)
1361        : Parent(*adaptor._digraph) {}
1362
1363      EdgeMap(const Adaptor& adaptor, const Value& value)
1364        : Parent(*adaptor._digraph, value) {}
1365
1366    private:
1367      EdgeMap& operator=(const EdgeMap& cmap) {
1368        return operator=<EdgeMap>(cmap);
1369      }
1370
1371      template <typename CMap>
1372      EdgeMap& operator=(const CMap& cmap) {
1373        Parent::operator=(cmap);
1374        return *this;
1375      }
1376
1377    };
1378
1379    typedef typename ItemSetTraits<Digraph, Node>::ItemNotifier NodeNotifier;
1380    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
1381
1382  protected:
1383
1384    UndirDigraphAdaptorBase() : _digraph(0) {}
1385
1386    Digraph* _digraph;
1387
1388    void setDigraph(Digraph& digraph) {
1389      _digraph = &digraph;
1390    }
1391   
1392  };
1393
1394  ///\ingroup graph_adaptors
1395  ///
1396  /// \brief An graph is made from a directed digraph by an adaptor
1397  ///
1398  /// This adaptor makes an undirected graph from a directed
1399  /// digraph. All arc of the underlying will be showed in the adaptor
1400  /// as an edge. Let's see an informal example about using
1401  /// this adaptor:
1402  ///
1403  /// There is a network of the streets of a town. Of course there are
1404  /// some one-way street in the town hence the network is a directed
1405  /// one. There is a crazy driver who go oppositely in the one-way
1406  /// street without moral sense. Of course he can pass this streets
1407  /// slower than the regular way, in fact his speed is half of the
1408  /// normal speed. How long should he drive to get from a source
1409  /// point to the target? Let see the example code which calculate it:
1410  ///
1411  /// \todo BadCode, SimpleMap does no exists
1412  ///\code
1413  /// typedef UndirDigraphAdaptor<Digraph> Graph;
1414  /// Graph graph(digraph);
1415  ///
1416  /// typedef SimpleMap<LengthMap> FLengthMap;
1417  /// FLengthMap flength(length);
1418  ///
1419  /// typedef ScaleMap<LengthMap> RLengthMap;
1420  /// RLengthMap rlength(length, 2.0);
1421  ///
1422  /// typedef Graph::CombinedArcMap<FLengthMap, RLengthMap > ULengthMap;
1423  /// ULengthMap ulength(flength, rlength);
1424  ///
1425  /// Dijkstra<Graph, ULengthMap> dijkstra(graph, ulength);
1426  /// std::cout << "Driving time : " << dijkstra.run(src, trg) << std::endl;
1427  ///\endcode
1428  ///
1429  /// The combined arc map makes the length map for the undirected
1430  /// graph. It is created from a forward and reverse map. The forward
1431  /// map is created from the original length map with a SimpleMap
1432  /// adaptor which just makes a read-write map from the reference map
1433  /// i.e. it forgets that it can be return reference to values. The
1434  /// reverse map is just the scaled original map with the ScaleMap
1435  /// adaptor. The combination solves that passing the reverse way
1436  /// takes double time than the original. To get the driving time we
1437  /// run the dijkstra algorithm on the graph.
1438  template<typename _Digraph>
1439  class UndirDigraphAdaptor
1440    : public GraphAdaptorExtender<UndirDigraphAdaptorBase<_Digraph> > {
1441  public:
1442    typedef _Digraph Digraph;
1443    typedef GraphAdaptorExtender<UndirDigraphAdaptorBase<Digraph> > Parent;
1444  protected:
1445    UndirDigraphAdaptor() { }
1446  public:
1447
1448    /// \brief Constructor
1449    ///
1450    /// Constructor
1451    UndirDigraphAdaptor(_Digraph& _digraph) {
1452      setDigraph(_digraph);
1453    }
1454
1455    /// \brief ArcMap combined from two original ArcMap
1456    ///
1457    /// This class adapts two original digraph ArcMap to
1458    /// get an arc map on the adaptor.
1459    template <typename _ForwardMap, typename _BackwardMap>
1460    class CombinedArcMap {
1461    public:
1462     
1463      typedef _ForwardMap ForwardMap;
1464      typedef _BackwardMap BackwardMap;
1465
1466      typedef typename MapTraits<ForwardMap>::ReferenceMapTag ReferenceMapTag;
1467
1468      typedef typename ForwardMap::Value Value;
1469      typedef typename Parent::Arc Key;
1470
1471      /// \brief Constructor     
1472      ///
1473      /// Constructor     
1474      CombinedArcMap() : _forward(0), _backward(0) {}
1475
1476      /// \brief Constructor     
1477      ///
1478      /// Constructor     
1479      CombinedArcMap(ForwardMap& forward, BackwardMap& backward)
1480        : _forward(&forward), _backward(&backward) {}
1481     
1482
1483      /// \brief Sets the value associated with a key.
1484      ///
1485      /// Sets the value associated with a key.
1486      void set(const Key& e, const Value& a) {
1487        if (Parent::direction(e)) {
1488          _forward->set(e, a);
1489        } else {
1490          _backward->set(e, a);
1491        }
1492      }
1493
1494      /// \brief Returns the value associated with a key.
1495      ///
1496      /// Returns the value associated with a key.
1497      typename MapTraits<ForwardMap>::ConstReturnValue
1498      operator[](const Key& e) const {
1499        if (Parent::direction(e)) {
1500          return (*_forward)[e];
1501        } else {
1502          return (*_backward)[e];
1503        }
1504      }
1505
1506      /// \brief Returns the value associated with a key.
1507      ///
1508      /// Returns the value associated with a key.
1509      typename MapTraits<ForwardMap>::ReturnValue
1510      operator[](const Key& e) {
1511        if (Parent::direction(e)) {
1512          return (*_forward)[e];
1513        } else {
1514          return (*_backward)[e];
1515        }
1516      }
1517
1518      /// \brief Sets the forward map
1519      ///
1520      /// Sets the forward map
1521      void setForwardMap(ForwardMap& forward) {
1522        _forward = &forward;
1523      }
1524
1525      /// \brief Sets the backward map
1526      ///
1527      /// Sets the backward map
1528      void setBackwardMap(BackwardMap& backward) {
1529        _backward = &backward;
1530      }
1531
1532    protected:
1533
1534      ForwardMap* _forward;
1535      BackwardMap* _backward;
1536
1537    };
1538
1539  };
1540
1541  /// \brief Just gives back an undir digraph adaptor
1542  ///
1543  /// Just gives back an undir digraph adaptor
1544  template<typename Digraph>
1545  UndirDigraphAdaptor<const Digraph>
1546  undirDigraphAdaptor(const Digraph& digraph) {
1547    return UndirDigraphAdaptor<const Digraph>(digraph);
1548  }
1549
1550  template<typename _Digraph,
1551           typename _CapacityMap = typename _Digraph::template ArcMap<int>,
1552           typename _FlowMap = _CapacityMap,
1553           typename _Tolerance = Tolerance<typename _CapacityMap::Value> >
1554  class ResForwardFilter {
1555  public:
1556
1557    typedef _Digraph Digraph;
1558    typedef _CapacityMap CapacityMap;
1559    typedef _FlowMap FlowMap;
1560    typedef _Tolerance Tolerance;
1561
1562    typedef typename Digraph::Arc Key;
1563    typedef bool Value;
1564
1565  private:
1566
1567    const CapacityMap* _capacity;
1568    const FlowMap* _flow;
1569    Tolerance _tolerance;
1570  public:
1571
1572    ResForwardFilter(const CapacityMap& capacity, const FlowMap& flow,
1573                     const Tolerance& tolerance = Tolerance())
1574      : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
1575
1576    ResForwardFilter(const Tolerance& tolerance = Tolerance())
1577      : _capacity(0), _flow(0), _tolerance(tolerance)  { }
1578
1579    void setCapacity(const CapacityMap& capacity) { _capacity = &capacity; }
1580    void setFlow(const FlowMap& flow) { _flow = &flow; }
1581
1582    bool operator[](const typename Digraph::Arc& a) const {
1583      return _tolerance.positive((*_capacity)[a] - (*_flow)[a]);
1584    }
1585  };
1586
1587  template<typename _Digraph,
1588           typename _CapacityMap = typename _Digraph::template ArcMap<int>,
1589           typename _FlowMap = _CapacityMap,
1590           typename _Tolerance = Tolerance<typename _CapacityMap::Value> >
1591  class ResBackwardFilter {
1592  public:
1593
1594    typedef _Digraph Digraph;
1595    typedef _CapacityMap CapacityMap;
1596    typedef _FlowMap FlowMap;
1597    typedef _Tolerance Tolerance;
1598
1599    typedef typename Digraph::Arc Key;
1600    typedef bool Value;
1601
1602  private:
1603
1604    const CapacityMap* _capacity;
1605    const FlowMap* _flow;
1606    Tolerance _tolerance;
1607
1608  public:
1609
1610    ResBackwardFilter(const CapacityMap& capacity, const FlowMap& flow,
1611                      const Tolerance& tolerance = Tolerance())
1612      : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
1613    ResBackwardFilter(const Tolerance& tolerance = Tolerance())
1614      : _capacity(0), _flow(0), _tolerance(tolerance) { }
1615
1616    void setCapacity(const CapacityMap& capacity) { _capacity = &capacity; }
1617    void setFlow(const FlowMap& flow) { _flow = &flow; }
1618
1619    bool operator[](const typename Digraph::Arc& a) const {
1620      return _tolerance.positive((*_flow)[a]);
1621    }
1622  };
1623
1624 
1625  ///\ingroup graph_adaptors
1626  ///
1627  ///\brief An adaptor for composing the residual graph for directed
1628  ///flow and circulation problems.
1629  ///
1630  ///An adaptor for composing the residual graph for directed flow and
1631  ///circulation problems.  Let \f$ G=(V, A) \f$ be a directed digraph
1632  ///and let \f$ F \f$ be a number type. Let moreover \f$ f,c:A\to F
1633  ///\f$, be functions on the arc-set.
1634  ///
1635  ///In the appications of ResDigraphAdaptor, \f$ f \f$ usually stands
1636  ///for a flow and \f$ c \f$ for a capacity function.  Suppose that a
1637  ///graph instance \c g of type \c ListDigraph implements \f$ G \f$.
1638  ///
1639  ///\code
1640  ///  ListDigraph g;
1641  ///\endcode
1642  ///
1643  ///Then ResDigraphAdaptor implements the digraph structure with
1644  /// node-set \f$ V \f$ and arc-set \f$ A_{forward}\cup A_{backward}
1645  /// \f$, where \f$ A_{forward}=\{uv : uv\in A, f(uv)<c(uv)\} \f$ and
1646  /// \f$ A_{backward}=\{vu : uv\in A, f(uv)>0\} \f$, i.e. the so
1647  /// called residual graph.  When we take the union \f$
1648  /// A_{forward}\cup A_{backward} \f$, multilicities are counted,
1649  /// i.e.  if an arc is in both \f$ A_{forward} \f$ and \f$
1650  /// A_{backward} \f$, then in the adaptor it appears twice. The
1651  /// following code shows how such an instance can be constructed.
1652  ///
1653  ///\code
1654  ///  typedef ListDigraph Digraph;
1655  ///  IntArcMap f(g), c(g);
1656  ///  ResDigraphAdaptor<Digraph, int, IntArcMap, IntArcMap> ga(g);
1657  ///\endcode
1658  template<typename _Digraph,
1659           typename _CapacityMap = typename _Digraph::template ArcMap<int>,
1660           typename _FlowMap = _CapacityMap,
1661           typename _Tolerance = Tolerance<typename _CapacityMap::Value> >
1662  class ResDigraphAdaptor :
1663    public ArcSubDigraphAdaptor<
1664    UndirDigraphAdaptor<const _Digraph>,
1665    typename UndirDigraphAdaptor<const _Digraph>::template CombinedArcMap<
1666      ResForwardFilter<const _Digraph, _CapacityMap, _FlowMap>, 
1667      ResBackwardFilter<const _Digraph, _CapacityMap, _FlowMap> > > {
1668  public:
1669
1670    typedef _Digraph Digraph;
1671    typedef _CapacityMap CapacityMap;
1672    typedef _FlowMap FlowMap;
1673    typedef _Tolerance Tolerance;
1674
1675    typedef typename CapacityMap::Value Value;
1676    typedef ResDigraphAdaptor Adaptor;
1677
1678  protected:
1679
1680    typedef UndirDigraphAdaptor<const Digraph> UndirDigraph;
1681
1682    typedef ResForwardFilter<const Digraph, CapacityMap, FlowMap>
1683    ForwardFilter;
1684
1685    typedef ResBackwardFilter<const Digraph, CapacityMap, FlowMap>
1686    BackwardFilter;
1687
1688    typedef typename UndirDigraph::
1689    template CombinedArcMap<ForwardFilter, BackwardFilter> ArcFilter;
1690
1691    typedef ArcSubDigraphAdaptor<UndirDigraph, ArcFilter> Parent;
1692
1693    const CapacityMap* _capacity;
1694    FlowMap* _flow;
1695
1696    UndirDigraph _graph;
1697    ForwardFilter _forward_filter;
1698    BackwardFilter _backward_filter;
1699    ArcFilter _arc_filter;
1700
1701    void setCapacityMap(const CapacityMap& capacity) {
1702      _capacity = &capacity;
1703      _forward_filter.setCapacity(capacity);
1704      _backward_filter.setCapacity(capacity);
1705    }
1706
1707    void setFlowMap(FlowMap& flow) {
1708      _flow = &flow;
1709      _forward_filter.setFlow(flow);
1710      _backward_filter.setFlow(flow);
1711    }
1712
1713  public:
1714
1715    /// \brief Constructor of the residual digraph.
1716    ///
1717    /// Constructor of the residual graph. The parameters are the digraph type,
1718    /// the flow map, the capacity map and a tolerance object.
1719    ResDigraphAdaptor(const Digraph& digraph, const CapacityMap& capacity,
1720                    FlowMap& flow, const Tolerance& tolerance = Tolerance())
1721      : Parent(), _capacity(&capacity), _flow(&flow), _graph(digraph),
1722        _forward_filter(capacity, flow, tolerance),
1723        _backward_filter(capacity, flow, tolerance),
1724        _arc_filter(_forward_filter, _backward_filter)
1725    {
1726      Parent::setDigraph(_graph);
1727      Parent::setArcFilterMap(_arc_filter);
1728    }
1729
1730    typedef typename Parent::Arc Arc;
1731
1732    /// \brief Gives back the residual capacity of the arc.
1733    ///
1734    /// Gives back the residual capacity of the arc.
1735    Value rescap(const Arc& arc) const {
1736      if (UndirDigraph::direction(arc)) {
1737        return (*_capacity)[arc] - (*_flow)[arc];
1738      } else {
1739        return (*_flow)[arc];
1740      }
1741    }
1742
1743    /// \brief Augment on the given arc in the residual digraph.
1744    ///
1745    /// Augment on the given arc in the residual digraph. It increase
1746    /// or decrease the flow on the original arc depend on the direction
1747    /// of the residual arc.
1748    void augment(const Arc& e, const Value& a) const {
1749      if (UndirDigraph::direction(e)) {
1750        _flow->set(e, (*_flow)[e] + a);
1751      } else { 
1752        _flow->set(e, (*_flow)[e] - a);
1753      }
1754    }
1755
1756    /// \brief Returns the direction of the arc.
1757    ///
1758    /// Returns true when the arc is same oriented as the original arc.
1759    static bool forward(const Arc& e) {
1760      return UndirDigraph::direction(e);
1761    }
1762
1763    /// \brief Returns the direction of the arc.
1764    ///
1765    /// Returns true when the arc is opposite oriented as the original arc.
1766    static bool backward(const Arc& e) {
1767      return !UndirDigraph::direction(e);
1768    }
1769
1770    /// \brief Gives back the forward oriented residual arc.
1771    ///
1772    /// Gives back the forward oriented residual arc.
1773    static Arc forward(const typename Digraph::Arc& e) {
1774      return UndirDigraph::direct(e, true);
1775    }
1776
1777    /// \brief Gives back the backward oriented residual arc.
1778    ///
1779    /// Gives back the backward oriented residual arc.
1780    static Arc backward(const typename Digraph::Arc& e) {
1781      return UndirDigraph::direct(e, false);
1782    }
1783
1784    /// \brief Residual capacity map.
1785    ///
1786    /// In generic residual digraphs the residual capacity can be obtained
1787    /// as a map.
1788    class ResCap {
1789    protected:
1790      const Adaptor* _adaptor;
1791    public:
1792      typedef Arc Key;
1793      typedef typename _CapacityMap::Value Value;
1794
1795      ResCap(const Adaptor& adaptor) : _adaptor(&adaptor) {}
1796     
1797      Value operator[](const Arc& e) const {
1798        return _adaptor->rescap(e);
1799      }
1800     
1801    };
1802
1803  };
1804
1805  /// \brief Base class for split digraph adaptor
1806  ///
1807  /// Base class of split digraph adaptor. In most case you do not need to
1808  /// use it directly but the documented member functions of this class can
1809  /// be used with the SplitDigraphAdaptor class.
1810  /// \sa SplitDigraphAdaptor
1811  template <typename _Digraph>
1812  class SplitDigraphAdaptorBase {
1813  public:
1814
1815    typedef _Digraph Digraph;
1816    typedef DigraphAdaptorBase<const _Digraph> Parent;
1817    typedef SplitDigraphAdaptorBase Adaptor;
1818
1819    typedef typename Digraph::Node DigraphNode;
1820    typedef typename Digraph::Arc DigraphArc;
1821
1822    class Node;
1823    class Arc;
1824
1825  private:
1826
1827    template <typename T> class NodeMapBase;
1828    template <typename T> class ArcMapBase;
1829
1830  public:
1831   
1832    class Node : public DigraphNode {
1833      friend class SplitDigraphAdaptorBase;
1834      template <typename T> friend class NodeMapBase;
1835    private:
1836
1837      bool _in;
1838      Node(DigraphNode node, bool in)
1839        : DigraphNode(node), _in(in) {}
1840     
1841    public:
1842
1843      Node() {}
1844      Node(Invalid) : DigraphNode(INVALID), _in(true) {}
1845
1846      bool operator==(const Node& node) const {
1847        return DigraphNode::operator==(node) && _in == node._in;
1848      }
1849     
1850      bool operator!=(const Node& node) const {
1851        return !(*this == node);
1852      }
1853     
1854      bool operator<(const Node& node) const {
1855        return DigraphNode::operator<(node) ||
1856          (DigraphNode::operator==(node) && _in < node._in);
1857      }
1858    };
1859
1860    class Arc {
1861      friend class SplitDigraphAdaptorBase;
1862      template <typename T> friend class ArcMapBase;
1863    private:
1864      typedef BiVariant<DigraphArc, DigraphNode> ArcImpl;
1865
1866      explicit Arc(const DigraphArc& arc) : _item(arc) {}
1867      explicit Arc(const DigraphNode& node) : _item(node) {}
1868     
1869      ArcImpl _item;
1870
1871    public:
1872      Arc() {}
1873      Arc(Invalid) : _item(DigraphArc(INVALID)) {}
1874
1875      bool operator==(const Arc& arc) const {
1876        if (_item.firstState()) {
1877          if (arc._item.firstState()) {
1878            return _item.first() == arc._item.first();
1879          }
1880        } else {
1881          if (arc._item.secondState()) {
1882            return _item.second() == arc._item.second();
1883          }
1884        }
1885        return false;
1886      }
1887     
1888      bool operator!=(const Arc& arc) const {
1889        return !(*this == arc);
1890      }
1891     
1892      bool operator<(const Arc& arc) const {
1893        if (_item.firstState()) {
1894          if (arc._item.firstState()) {
1895            return _item.first() < arc._item.first();
1896          }
1897          return false;
1898        } else {
1899          if (arc._item.secondState()) {
1900            return _item.second() < arc._item.second();
1901          }
1902          return true;
1903        }
1904      }
1905
1906      operator DigraphArc() const { return _item.first(); }
1907      operator DigraphNode() const { return _item.second(); }
1908
1909    };
1910
1911    void first(Node& n) const {
1912      _digraph->first(n);
1913      n._in = true;
1914    }
1915
1916    void next(Node& n) const {
1917      if (n._in) {
1918        n._in = false;
1919      } else {
1920        n._in = true;
1921        _digraph->next(n);
1922      }
1923    }
1924
1925    void first(Arc& e) const {
1926      e._item.setSecond();
1927      _digraph->first(e._item.second());
1928      if (e._item.second() == INVALID) {
1929        e._item.setFirst();
1930        _digraph->first(e._item.first());
1931      }
1932    }
1933
1934    void next(Arc& e) const {
1935      if (e._item.secondState()) {
1936        _digraph->next(e._item.second());
1937        if (e._item.second() == INVALID) {
1938          e._item.setFirst();
1939          _digraph->first(e._item.first());
1940        }
1941      } else {
1942        _digraph->next(e._item.first());
1943      }     
1944    }
1945
1946    void firstOut(Arc& e, const Node& n) const {
1947      if (n._in) {
1948        e._item.setSecond(n);
1949      } else {
1950        e._item.setFirst();
1951        _digraph->firstOut(e._item.first(), n);
1952      }
1953    }
1954
1955    void nextOut(Arc& e) const {
1956      if (!e._item.firstState()) {
1957        e._item.setFirst(INVALID);
1958      } else {
1959        _digraph->nextOut(e._item.first());
1960      }     
1961    }
1962
1963    void firstIn(Arc& e, const Node& n) const {
1964      if (!n._in) {
1965        e._item.setSecond(n);       
1966      } else {
1967        e._item.setFirst();
1968        _digraph->firstIn(e._item.first(), n);
1969      }
1970    }
1971
1972    void nextIn(Arc& e) const {
1973      if (!e._item.firstState()) {
1974        e._item.setFirst(INVALID);
1975      } else {
1976        _digraph->nextIn(e._item.first());
1977      }
1978    }
1979
1980    Node source(const Arc& e) const {
1981      if (e._item.firstState()) {
1982        return Node(_digraph->source(e._item.first()), false);
1983      } else {
1984        return Node(e._item.second(), true);
1985      }
1986    }
1987
1988    Node target(const Arc& e) const {
1989      if (e._item.firstState()) {
1990        return Node(_digraph->target(e._item.first()), true);
1991      } else {
1992        return Node(e._item.second(), false);
1993      }
1994    }
1995
1996    int id(const Node& n) const {
1997      return (_digraph->id(n) << 1) | (n._in ? 0 : 1);
1998    }
1999    Node nodeFromId(int ix) const {
2000      return Node(_digraph->nodeFromId(ix >> 1), (ix & 1) == 0);
2001    }
2002    int maxNodeId() const {
2003      return 2 * _digraph->maxNodeId() + 1;
2004    }
2005
2006    int id(const Arc& e) const {
2007      if (e._item.firstState()) {
2008        return _digraph->id(e._item.first()) << 1;
2009      } else {
2010        return (_digraph->id(e._item.second()) << 1) | 1;
2011      }
2012    }
2013    Arc arcFromId(int ix) const {
2014      if ((ix & 1) == 0) {
2015        return Arc(_digraph->arcFromId(ix >> 1));
2016      } else {
2017        return Arc(_digraph->nodeFromId(ix >> 1));
2018      }
2019    }
2020    int maxArcId() const {
2021      return std::max(_digraph->maxNodeId() << 1,
2022                      (_digraph->maxArcId() << 1) | 1);
2023    }
2024
2025    /// \brief Returns true when the node is in-node.
2026    ///
2027    /// Returns true when the node is in-node.
2028    static bool inNode(const Node& n) {
2029      return n._in;
2030    }
2031
2032    /// \brief Returns true when the node is out-node.
2033    ///
2034    /// Returns true when the node is out-node.
2035    static bool outNode(const Node& n) {
2036      return !n._in;
2037    }
2038
2039    /// \brief Returns true when the arc is arc in the original digraph.
2040    ///
2041    /// Returns true when the arc is arc in the original digraph.
2042    static bool origArc(const Arc& e) {
2043      return e._item.firstState();
2044    }
2045
2046    /// \brief Returns true when the arc binds an in-node and an out-node.
2047    ///
2048    /// Returns true when the arc binds an in-node and an out-node.
2049    static bool bindArc(const Arc& e) {
2050      return e._item.secondState();
2051    }
2052
2053    /// \brief Gives back the in-node created from the \c node.
2054    ///
2055    /// Gives back the in-node created from the \c node.
2056    static Node inNode(const DigraphNode& n) {
2057      return Node(n, true);
2058    }
2059
2060    /// \brief Gives back the out-node created from the \c node.
2061    ///
2062    /// Gives back the out-node created from the \c node.
2063    static Node outNode(const DigraphNode& n) {
2064      return Node(n, false);
2065    }
2066
2067    /// \brief Gives back the arc binds the two part of the node.
2068    ///
2069    /// Gives back the arc binds the two part of the node.
2070    static Arc arc(const DigraphNode& n) {
2071      return Arc(n);
2072    }
2073
2074    /// \brief Gives back the arc of the original arc.
2075    ///
2076    /// Gives back the arc of the original arc.
2077    static Arc arc(const DigraphArc& e) {
2078      return Arc(e);
2079    }
2080
2081    typedef True NodeNumTag;
2082
2083    int nodeNum() const {
2084      return  2 * countNodes(*_digraph);
2085    }
2086
2087    typedef True EdgeNumTag;
2088    int arcNum() const {
2089      return countArcs(*_digraph) + countNodes(*_digraph);
2090    }
2091
2092    typedef True FindEdgeTag;
2093    Arc findArc(const Node& u, const Node& v,
2094                const Arc& prev = INVALID) const {
2095      if (inNode(u)) {
2096        if (outNode(v)) {
2097          if (static_cast<const DigraphNode&>(u) ==
2098              static_cast<const DigraphNode&>(v) && prev == INVALID) {
2099            return Arc(u);
2100          }
2101        }
2102      } else {
2103        if (inNode(v)) {
2104          return Arc(::lemon::findArc(*_digraph, u, v, prev));
2105        }
2106      }
2107      return INVALID;
2108    }
2109
2110  private:
2111   
2112    template <typename _Value>
2113    class NodeMapBase
2114      : public MapTraits<typename Parent::template NodeMap<_Value> > {
2115      typedef typename Parent::template NodeMap<_Value> NodeImpl;
2116    public:
2117      typedef Node Key;
2118      typedef _Value Value;
2119     
2120      NodeMapBase(const Adaptor& adaptor)
2121        : _in_map(*adaptor._digraph), _out_map(*adaptor._digraph) {}
2122      NodeMapBase(const Adaptor& adaptor, const Value& value)
2123        : _in_map(*adaptor._digraph, value),
2124          _out_map(*adaptor._digraph, value) {}
2125
2126      void set(const Node& key, const Value& val) {
2127        if (Adaptor::inNode(key)) { _in_map.set(key, val); }
2128        else {_out_map.set(key, val); }
2129      }
2130     
2131      typename MapTraits<NodeImpl>::ReturnValue
2132      operator[](const Node& key) {
2133        if (Adaptor::inNode(key)) { return _in_map[key]; }
2134        else { return _out_map[key]; }
2135      }
2136
2137      typename MapTraits<NodeImpl>::ConstReturnValue
2138      operator[](const Node& key) const {
2139        if (Adaptor::inNode(key)) { return _in_map[key]; }
2140        else { return _out_map[key]; }
2141      }
2142
2143    private:
2144      NodeImpl _in_map, _out_map;
2145    };
2146
2147    template <typename _Value>
2148    class ArcMapBase
2149      : public MapTraits<typename Parent::template ArcMap<_Value> > {
2150      typedef typename Parent::template ArcMap<_Value> ArcImpl;
2151      typedef typename Parent::template NodeMap<_Value> NodeImpl;
2152    public:
2153      typedef Arc Key;
2154      typedef _Value Value;
2155
2156      ArcMapBase(const Adaptor& adaptor)
2157        : _arc_map(*adaptor._digraph), _node_map(*adaptor._digraph) {}
2158      ArcMapBase(const Adaptor& adaptor, const Value& value)
2159        : _arc_map(*adaptor._digraph, value),
2160          _node_map(*adaptor._digraph, value) {}
2161
2162      void set(const Arc& key, const Value& val) {
2163        if (Adaptor::origArc(key)) {
2164          _arc_map.set(key._item.first(), val);
2165        } else {
2166          _node_map.set(key._item.second(), val);
2167        }
2168      }
2169     
2170      typename MapTraits<ArcImpl>::ReturnValue
2171      operator[](const Arc& key) {
2172        if (Adaptor::origArc(key)) {
2173          return _arc_map[key._item.first()];
2174        } else {
2175          return _node_map[key._item.second()];
2176        }
2177      }
2178
2179      typename MapTraits<ArcImpl>::ConstReturnValue
2180      operator[](const Arc& key) const {
2181        if (Adaptor::origArc(key)) {
2182          return _arc_map[key._item.first()];
2183        } else {
2184          return _node_map[key._item.second()];
2185        }
2186      }
2187
2188    private:
2189      ArcImpl _arc_map;
2190      NodeImpl _node_map;
2191    };
2192
2193  public:
2194
2195    template <typename _Value>
2196    class NodeMap
2197      : public SubMapExtender<Adaptor, NodeMapBase<_Value> >
2198    {
2199    public:
2200      typedef _Value Value;
2201      typedef SubMapExtender<Adaptor, NodeMapBase<Value> > Parent;
2202   
2203      NodeMap(const Adaptor& adaptor)
2204        : Parent(adaptor) {}
2205
2206      NodeMap(const Adaptor& adaptor, const Value& value)
2207        : Parent(adaptor, value) {}
2208   
2209    private:
2210      NodeMap& operator=(const NodeMap& cmap) {
2211        return operator=<NodeMap>(cmap);
2212      }
2213   
2214      template <typename CMap>
2215      NodeMap& operator=(const CMap& cmap) {
2216        Parent::operator=(cmap);
2217        return *this;
2218      }
2219    };
2220
2221    template <typename _Value>
2222    class ArcMap
2223      : public SubMapExtender<Adaptor, ArcMapBase<_Value> >
2224    {
2225    public:
2226      typedef _Value Value;
2227      typedef SubMapExtender<Adaptor, ArcMapBase<Value> > Parent;
2228   
2229      ArcMap(const Adaptor& adaptor)
2230        : Parent(adaptor) {}
2231
2232      ArcMap(const Adaptor& adaptor, const Value& value)
2233        : Parent(adaptor, value) {}
2234   
2235    private:
2236      ArcMap& operator=(const ArcMap& cmap) {
2237        return operator=<ArcMap>(cmap);
2238      }
2239   
2240      template <typename CMap>
2241      ArcMap& operator=(const CMap& cmap) {
2242        Parent::operator=(cmap);
2243        return *this;
2244      }
2245    };
2246
2247  protected:
2248
2249    SplitDigraphAdaptorBase() : _digraph(0) {}
2250
2251    Digraph* _digraph;
2252
2253    void setDigraph(Digraph& digraph) {
2254      _digraph = &digraph;
2255    }
2256   
2257  };
2258
2259  /// \ingroup graph_adaptors
2260  ///
2261  /// \brief Split digraph adaptor class
2262  ///
2263  /// This is an digraph adaptor which splits all node into an in-node
2264  /// and an out-node. Formaly, the adaptor replaces each \f$ u \f$
2265  /// node in the digraph with two node, \f$ u_{in} \f$ node and
2266  /// \f$ u_{out} \f$ node. If there is an \f$ (v, u) \f$ arc in the
2267  /// original digraph the new target of the arc will be \f$ u_{in} \f$ and
2268  /// similarly the source of the original \f$ (u, v) \f$ arc will be
2269  /// \f$ u_{out} \f$.  The adaptor will add for each node in the
2270  /// original digraph an additional arc which will connect
2271  /// \f$ (u_{in}, u_{out}) \f$.
2272  ///
2273  /// The aim of this class is to run algorithm with node costs if the
2274  /// algorithm can use directly just arc costs. In this case we should use
2275  /// a \c SplitDigraphAdaptor and set the node cost of the digraph to the
2276  /// bind arc in the adapted digraph.
2277  ///
2278  /// By example a maximum flow algoritm can compute how many arc
2279  /// disjoint paths are in the digraph. But we would like to know how
2280  /// many node disjoint paths are in the digraph. First we have to
2281  /// adapt the digraph with the \c SplitDigraphAdaptor. Then run the flow
2282  /// algorithm on the adapted digraph. The bottleneck of the flow will
2283  /// be the bind arcs which bounds the flow with the count of the
2284  /// node disjoint paths.
2285  ///
2286  ///\code
2287  ///
2288  /// typedef SplitDigraphAdaptor<SmartDigraph> SDigraph;
2289  ///
2290  /// SDigraph sdigraph(digraph);
2291  ///
2292  /// typedef ConstMap<SDigraph::Arc, int> SCapacity;
2293  /// SCapacity scapacity(1);
2294  ///
2295  /// SDigraph::ArcMap<int> sflow(sdigraph);
2296  ///
2297  /// Preflow<SDigraph, SCapacity>
2298  ///   spreflow(sdigraph, scapacity,
2299  ///            SDigraph::outNode(source), SDigraph::inNode(target));
2300  ///                                           
2301  /// spreflow.run();
2302  ///
2303  ///\endcode
2304  ///
2305  /// The result of the mamixum flow on the original digraph
2306  /// shows the next figure:
2307  ///
2308  /// \image html arc_disjoint.png
2309  /// \image latex arc_disjoint.eps "Arc disjoint paths" width=\textwidth
2310  ///
2311  /// And the maximum flow on the adapted digraph:
2312  ///
2313  /// \image html node_disjoint.png
2314  /// \image latex node_disjoint.eps "Node disjoint paths" width=\textwidth
2315  ///
2316  /// The second solution contains just 3 disjoint paths while the first 4.
2317  /// The full code can be found in the \ref disjoint_paths_demo.cc demo file.
2318  ///
2319  /// This digraph adaptor is fully conform to the
2320  /// \ref concepts::Digraph "Digraph" concept and
2321  /// contains some additional member functions and types. The
2322  /// documentation of some member functions may be found just in the
2323  /// SplitDigraphAdaptorBase class.
2324  ///
2325  /// \sa SplitDigraphAdaptorBase
2326  template <typename _Digraph>
2327  class SplitDigraphAdaptor
2328    : public DigraphAdaptorExtender<SplitDigraphAdaptorBase<_Digraph> > {
2329  public:
2330    typedef _Digraph Digraph;
2331    typedef DigraphAdaptorExtender<SplitDigraphAdaptorBase<Digraph> > Parent;
2332
2333    typedef typename Parent::Node Node;
2334    typedef typename Parent::Arc Arc;
2335
2336    /// \brief Constructor of the adaptor.
2337    ///
2338    /// Constructor of the adaptor.
2339    SplitDigraphAdaptor(Digraph& g) {
2340      Parent::setDigraph(g);
2341    }
2342
2343    /// \brief NodeMap combined from two original NodeMap
2344    ///
2345    /// This class adapt two of the original digraph NodeMap to
2346    /// get a node map on the adapted digraph.
2347    template <typename InNodeMap, typename OutNodeMap>
2348    class CombinedNodeMap {
2349    public:
2350
2351      typedef Node Key;
2352      typedef typename InNodeMap::Value Value;
2353
2354      /// \brief Constructor
2355      ///
2356      /// Constructor.
2357      CombinedNodeMap(InNodeMap& in_map, OutNodeMap& out_map)
2358        : _in_map(in_map), _out_map(out_map) {}
2359
2360      /// \brief The subscript operator.
2361      ///
2362      /// The subscript operator.
2363      Value& operator[](const Key& key) {
2364        if (Parent::inNode(key)) {
2365          return _in_map[key];
2366        } else {
2367          return _out_map[key];
2368        }
2369      }
2370
2371      /// \brief The const subscript operator.
2372      ///
2373      /// The const subscript operator.
2374      Value operator[](const Key& key) const {
2375        if (Parent::inNode(key)) {
2376          return _in_map[key];
2377        } else {
2378          return _out_map[key];
2379        }
2380      }
2381
2382      /// \brief The setter function of the map.
2383      ///
2384      /// The setter function of the map.
2385      void set(const Key& key, const Value& value) {
2386        if (Parent::inNode(key)) {
2387          _in_map.set(key, value);
2388        } else {
2389          _out_map.set(key, value);
2390        }
2391      }
2392     
2393    private:
2394     
2395      InNodeMap& _in_map;
2396      OutNodeMap& _out_map;
2397     
2398    };
2399
2400
2401    /// \brief Just gives back a combined node map.
2402    ///
2403    /// Just gives back a combined node map.
2404    template <typename InNodeMap, typename OutNodeMap>
2405    static CombinedNodeMap<InNodeMap, OutNodeMap>
2406    combinedNodeMap(InNodeMap& in_map, OutNodeMap& out_map) {
2407      return CombinedNodeMap<InNodeMap, OutNodeMap>(in_map, out_map);
2408    }
2409
2410    template <typename InNodeMap, typename OutNodeMap>
2411    static CombinedNodeMap<const InNodeMap, OutNodeMap>
2412    combinedNodeMap(const InNodeMap& in_map, OutNodeMap& out_map) {
2413      return CombinedNodeMap<const InNodeMap, OutNodeMap>(in_map, out_map);
2414    }
2415
2416    template <typename InNodeMap, typename OutNodeMap>
2417    static CombinedNodeMap<InNodeMap, const OutNodeMap>
2418    combinedNodeMap(InNodeMap& in_map, const OutNodeMap& out_map) {
2419      return CombinedNodeMap<InNodeMap, const OutNodeMap>(in_map, out_map);
2420    }
2421
2422    template <typename InNodeMap, typename OutNodeMap>
2423    static CombinedNodeMap<const InNodeMap, const OutNodeMap>
2424    combinedNodeMap(const InNodeMap& in_map, const OutNodeMap& out_map) {
2425      return CombinedNodeMap<const InNodeMap,
2426        const OutNodeMap>(in_map, out_map);
2427    }
2428
2429    /// \brief ArcMap combined from an original ArcMap and NodeMap
2430    ///
2431    /// This class adapt an original digraph ArcMap and NodeMap to
2432    /// get an arc map on the adapted digraph.
2433    template <typename DigraphArcMap, typename DigraphNodeMap>
2434    class CombinedArcMap {
2435    public:
2436     
2437      typedef Arc Key;
2438      typedef typename DigraphArcMap::Value Value;
2439     
2440      /// \brief Constructor
2441      ///
2442      /// Constructor.
2443      CombinedArcMap(DigraphArcMap& arc_map, DigraphNodeMap& node_map)
2444        : _arc_map(arc_map), _node_map(node_map) {}
2445
2446      /// \brief The subscript operator.
2447      ///
2448      /// The subscript operator.
2449      void set(const Arc& arc, const Value& val) {
2450        if (Parent::origArc(arc)) {
2451          _arc_map.set(arc, val);
2452        } else {
2453          _node_map.set(arc, val);
2454        }
2455      }
2456
2457      /// \brief The const subscript operator.
2458      ///
2459      /// The const subscript operator.
2460      Value operator[](const Key& arc) const {
2461        if (Parent::origArc(arc)) {
2462          return _arc_map[arc];
2463        } else {
2464          return _node_map[arc];
2465        }
2466      }     
2467
2468      /// \brief The const subscript operator.
2469      ///
2470      /// The const subscript operator.
2471      Value& operator[](const Key& arc) {
2472        if (Parent::origArc(arc)) {
2473          return _arc_map[arc];
2474        } else {
2475          return _node_map[arc];
2476        }
2477      }     
2478     
2479    private:
2480      DigraphArcMap& _arc_map;
2481      DigraphNodeMap& _node_map;
2482    };
2483                   
2484    /// \brief Just gives back a combined arc map.
2485    ///
2486    /// Just gives back a combined arc map.
2487    template <typename DigraphArcMap, typename DigraphNodeMap>
2488    static CombinedArcMap<DigraphArcMap, DigraphNodeMap>
2489    combinedArcMap(DigraphArcMap& arc_map, DigraphNodeMap& node_map) {
2490      return CombinedArcMap<DigraphArcMap, DigraphNodeMap>(arc_map, node_map);
2491    }
2492
2493    template <typename DigraphArcMap, typename DigraphNodeMap>
2494    static CombinedArcMap<const DigraphArcMap, DigraphNodeMap>
2495    combinedArcMap(const DigraphArcMap& arc_map, DigraphNodeMap& node_map) {
2496      return CombinedArcMap<const DigraphArcMap,
2497        DigraphNodeMap>(arc_map, node_map);
2498    }
2499
2500    template <typename DigraphArcMap, typename DigraphNodeMap>
2501    static CombinedArcMap<DigraphArcMap, const DigraphNodeMap>
2502    combinedArcMap(DigraphArcMap& arc_map, const DigraphNodeMap& node_map) {
2503      return CombinedArcMap<DigraphArcMap,
2504        const DigraphNodeMap>(arc_map, node_map);
2505    }
2506
2507    template <typename DigraphArcMap, typename DigraphNodeMap>
2508    static CombinedArcMap<const DigraphArcMap, const DigraphNodeMap>
2509    combinedArcMap(const DigraphArcMap& arc_map,
2510                    const DigraphNodeMap& node_map) {
2511      return CombinedArcMap<const DigraphArcMap,
2512        const DigraphNodeMap>(arc_map, node_map);
2513    }
2514
2515  };
2516
2517  /// \brief Just gives back a split digraph adaptor
2518  ///
2519  /// Just gives back a split digraph adaptor
2520  template<typename Digraph>
2521  SplitDigraphAdaptor<Digraph>
2522  splitDigraphAdaptor(const Digraph& digraph) {
2523    return SplitDigraphAdaptor<Digraph>(digraph);
2524  }
2525
2526
2527} //namespace lemon
2528
2529#endif //LEMON_DIGRAPH_ADAPTOR_H
2530
Note: See TracBrowser for help on using the repository browser.