lemon/adaptors.h
author Peter Kovacs <kpeter@inf.elte.hu>
Tue, 09 Feb 2010 23:29:51 +0100
changeset 823 a7e93de12cbd
parent 656 cb38ccedd2c1
child 877 141f9c0db4a3
permissions -rw-r--r--
Add a warning about huge capacities in Preflow (#319)
     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-2009
     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     DigraphAdaptorBase() : _digraph(0) { }
    55     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     void first(Node& i) const { _digraph->first(i); }
    64     void first(Arc& i) const { _digraph->first(i); }
    65     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     void next(Node& i) const { _digraph->next(i); }
    69     void next(Arc& i) const { _digraph->next(i); }
    70     void nextIn(Arc& i) const { _digraph->nextIn(i); }
    71     void nextOut(Arc& i) const { _digraph->nextOut(i); }
    72 
    73     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     class NodeMap : public DGR::template NodeMap<V> {
   112       typedef typename DGR::template NodeMap<V> Parent;
   113 
   114     public:
   115       explicit NodeMap(const Adaptor& adaptor)
   116         : 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     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     void firstOut(Arc& a, const Node& n ) const { Parent::firstIn(a, n); }
   334 
   335     void nextIn(Arc& a) const { Parent::nextOut(a); }
   336     void nextOut(Arc& a) const { Parent::nextIn(a); }
   337 
   338     Node source(const Arc& a) const { return Parent::target(a); }
   339     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     explicit ReverseDigraph(DGR& digraph) {
   391       Parent::initialize(digraph);
   392     }
   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