lemon/adaptors.h
author Peter Kovacs <kpeter@inf.elte.hu>
Tue, 24 Mar 2009 00:18:25 +0100
changeset 604 8c3112a66878
parent 516 dab9e610e37d
child 559 c5fd2d996909
permissions -rw-r--r--
Use XTI implementation instead of ATI in NetworkSimplex (#234)

XTI (eXtended Threaded Index) is an imporved version of the widely
known ATI (Augmented Threaded Index) method for storing and updating
the spanning tree structure in Network Simplex algorithms.

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