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