src/lemon/graph_wrapper.h
author marci
Fri, 01 Oct 2004 11:31:03 +0000
changeset 933 1b7c88fbb950
parent 932 ade3cdb9b45d
child 970 09f9abe22df2
permissions -rw-r--r--
NodeSubGraphWrapper, test, and ducumentation modifications.
     1 /* -*- C++ -*-
     2  * src/lemon/graph_wrapper.h - Part of LEMON, a generic C++ optimization library
     3  *
     4  * Copyright (C) 2004 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     5  * (Egervary Combinatorial Optimization Research Group, EGRES).
     6  *
     7  * Permission to use, modify and distribute this software is granted
     8  * provided that this copyright notice appears in all copies. For
     9  * precise terms see the accompanying LICENSE file.
    10  *
    11  * This software is provided "AS IS" with no warranty of any kind,
    12  * express or implied, and with no claim as to its suitability for any
    13  * purpose.
    14  *
    15  */
    16 
    17 #ifndef LEMON_GRAPH_WRAPPER_H
    18 #define LEMON_GRAPH_WRAPPER_H
    19 
    20 ///\ingroup gwrappers
    21 ///\file
    22 ///\brief Several graph wrappers.
    23 ///
    24 ///This file contains several useful graph wrapper functions.
    25 ///
    26 ///\author Marton Makai
    27 
    28 #include <lemon/invalid.h>
    29 #include <lemon/maps.h>
    30 #include <lemon/map_defines.h>
    31 #include <iostream>
    32 
    33 namespace lemon {
    34 
    35   // Graph wrappers
    36 
    37   /// \addtogroup gwrappers
    38   /// The main parts of LEMON are the different graph structures, 
    39   /// generic graph algorithms, graph concepts which couple these, and 
    40   /// graph wrappers. While the previous ones are more or less clear, the 
    41   /// latter notion needs further explanation.
    42   /// Graph wrappers are graph classes which serve for considering graph 
    43   /// structures in different ways. A short example makes the notion much 
    44   /// clearer. 
    45   /// Suppose that we have an instance \c g of a directed graph
    46   /// type say \c ListGraph and an algorithm 
    47   /// \code template<typename Graph> int algorithm(const Graph&); \endcode 
    48   /// is needed to run on the reversely oriented graph. 
    49   /// It may be expensive (in time or in memory usage) to copy 
    50   /// \c g with the reverse orientation. 
    51   /// Thus, a wrapper class
    52   /// \code template<typename Graph> class RevGraphWrapper; \endcode is used. 
    53   /// The code looks as follows
    54   /// \code
    55   /// ListGraph g;
    56   /// RevGraphWrapper<ListGraph> rgw(g);
    57   /// int result=algorithm(rgw);
    58   /// \endcode
    59   /// After running the algorithm, the original graph \c g 
    60   /// remains untouched. Thus the graph wrapper used above is to consider the 
    61   /// original graph with reverse orientation. 
    62   /// This techniques gives rise to an elegant code, and 
    63   /// based on stable graph wrappers, complex algorithms can be 
    64   /// implemented easily. 
    65   /// In flow, circulation and bipartite matching problems, the residual 
    66   /// graph is of particular importance. Combining a wrapper implementing 
    67   /// this, shortest path algorithms and minimum mean cycle algorithms, 
    68   /// a range of weighted and cardinality optimization algorithms can be 
    69   /// obtained. For lack of space, for other examples, 
    70   /// the interested user is referred to the detailed documentation of graph 
    71   /// wrappers. 
    72   /// The behavior of graph wrappers can be very different. Some of them keep 
    73   /// capabilities of the original graph while in other cases this would be 
    74   /// meaningless. This means that the concepts that they are a model of depend 
    75   /// on the graph wrapper, and the wrapped graph(s). 
    76   /// If an edge of \c rgw is deleted, this is carried out by 
    77   /// deleting the corresponding edge of \c g. But for a residual 
    78   /// graph, this operation has no sense. 
    79   /// Let we stand one more example here to simplify your work. 
    80   /// wrapper class
    81   /// \code template<typename Graph> class RevGraphWrapper; \endcode 
    82   /// has constructor 
    83   /// <tt> RevGraphWrapper(Graph& _g)</tt>. 
    84   /// This means that in a situation, 
    85   /// when a <tt> const ListGraph& </tt> reference to a graph is given, 
    86   /// then it have to be instantiated with <tt>Graph=const ListGraph</tt>.
    87   /// \code
    88   /// int algorithm1(const ListGraph& g) {
    89   ///   RevGraphWrapper<const ListGraph> rgw(g);
    90   ///   return algorithm2(rgw);
    91   /// }
    92   /// \endcode
    93 
    94   /// \addtogroup gwrappers
    95   /// @{
    96 
    97   ///Base type for the Graph Wrappers
    98 
    99   ///\warning Graph wrappers are in even more experimental state than the other
   100   ///parts of the lib. Use them at you own risk.
   101   ///
   102   /// This is the base type for most of LEMON graph wrappers. 
   103   /// This class implements a trivial graph wrapper i.e. it only wraps the 
   104   /// functions and types of the graph. The purpose of this class is to 
   105   /// make easier implementing graph wrappers. E.g. if a wrapper is 
   106   /// considered which differs from the wrapped graph only in some of its 
   107   /// functions or types, then it can be derived from GraphWrapper, and only the 
   108   /// differences should be implemented.
   109   ///
   110   ///\author Marton Makai 
   111   template<typename Graph>
   112   class GraphWrapper {
   113   protected:
   114     Graph* graph;
   115     GraphWrapper() : graph(0) { }
   116     void setGraph(Graph& _graph) { graph=&_graph; }
   117 
   118   public:
   119     typedef Graph BaseGraph;
   120     typedef Graph ParentGraph;
   121 
   122     GraphWrapper(Graph& _graph) : graph(&_graph) { }
   123     GraphWrapper(const GraphWrapper<Graph>& gw) : graph(gw.graph) { }
   124  
   125     typedef typename Graph::Node Node;
   126     class NodeIt : public Node { 
   127       const GraphWrapper<Graph>* gw;
   128       friend class GraphWrapper<Graph>;
   129      public:
   130       NodeIt() { }
   131       NodeIt(Invalid i) : Node(i) { }
   132       NodeIt(const GraphWrapper<Graph>& _gw) : 
   133 	Node(typename Graph::NodeIt(*(_gw.graph))), gw(&_gw) { }
   134       NodeIt(const GraphWrapper<Graph>& _gw, const Node& n) : 
   135 	Node(n), gw(&_gw) { }
   136       NodeIt& operator++() { 
   137 	*(static_cast<Node*>(this))=
   138 	  ++(typename Graph::NodeIt(*(gw->graph), *this));
   139 	return *this; 
   140       }
   141     };
   142     typedef typename Graph::Edge Edge;
   143     class OutEdgeIt : public Edge { 
   144       const GraphWrapper<Graph>* gw;
   145       friend class GraphWrapper<Graph>;
   146      public:
   147       OutEdgeIt() { }
   148       OutEdgeIt(Invalid i) : Edge(i) { }
   149       OutEdgeIt(const GraphWrapper<Graph>& _gw, const Node& n) : 
   150 	Edge(typename Graph::OutEdgeIt(*(_gw.graph), n)), gw(&_gw) { }
   151       OutEdgeIt(const GraphWrapper<Graph>& _gw, const Edge& e) : 
   152 	Edge(e), gw(&_gw) { }
   153       OutEdgeIt& operator++() { 
   154 	*(static_cast<Edge*>(this))=
   155 	  ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
   156 	return *this; 
   157       }
   158     };
   159     class InEdgeIt : public Edge { 
   160       const GraphWrapper<Graph>* gw;
   161       friend class GraphWrapper<Graph>;
   162      public:
   163       InEdgeIt() { }
   164       InEdgeIt(Invalid i) : Edge(i) { }
   165       InEdgeIt(const GraphWrapper<Graph>& _gw, const Node& n) : 
   166 	Edge(typename Graph::InEdgeIt(*(_gw.graph), n)), gw(&_gw) { }
   167       InEdgeIt(const GraphWrapper<Graph>& _gw, const Edge& e) : 
   168 	Edge(e), gw(&_gw) { }
   169       InEdgeIt& operator++() { 
   170 	*(static_cast<Edge*>(this))=
   171 	  ++(typename Graph::InEdgeIt(*(gw->graph), *this));
   172 	return *this; 
   173       }
   174     };
   175     class EdgeIt : public Edge { 
   176       const GraphWrapper<Graph>* gw;
   177       friend class GraphWrapper<Graph>;
   178      public:
   179       EdgeIt() { }
   180       EdgeIt(Invalid i) : Edge(i) { }
   181       EdgeIt(const GraphWrapper<Graph>& _gw) : 
   182 	Edge(typename Graph::EdgeIt(*(_gw.graph))), gw(&_gw) { }
   183       EdgeIt(const GraphWrapper<Graph>& _gw, const Edge& e) : 
   184 	Edge(e), gw(&_gw) { }
   185       EdgeIt& operator++() { 
   186 	*(static_cast<Edge*>(this))=
   187 	  ++(typename Graph::EdgeIt(*(gw->graph), *this));
   188 	return *this; 
   189       }
   190     };
   191    
   192     NodeIt& first(NodeIt& i) const { 
   193       i=NodeIt(*this); return i;
   194     }
   195     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
   196       i=OutEdgeIt(*this, p); return i;
   197     }
   198     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
   199       i=InEdgeIt(*this, p); return i;
   200     }
   201     EdgeIt& first(EdgeIt& i) const { 
   202       i=EdgeIt(*this); return i;
   203     }
   204 
   205     Node tail(const Edge& e) const { 
   206       return Node(graph->tail(static_cast<typename Graph::Edge>(e))); }
   207     Node head(const Edge& e) const { 
   208       return Node(graph->head(static_cast<typename Graph::Edge>(e))); }
   209 
   210     int nodeNum() const { return graph->nodeNum(); }
   211     int edgeNum() const { return graph->edgeNum(); }
   212   
   213     Node addNode() const { return Node(graph->addNode()); }
   214     Edge addEdge(const Node& tail, const Node& head) const { 
   215       return Edge(graph->addEdge(tail, head)); }
   216 
   217     void erase(const Node& i) const { graph->erase(i); }
   218     void erase(const Edge& i) const { graph->erase(i); }
   219   
   220     void clear() const { graph->clear(); }
   221     
   222     bool forward(const Edge& e) const { return graph->forward(e); }
   223     bool backward(const Edge& e) const { return graph->backward(e); }
   224 
   225     int id(const Node& v) const { return graph->id(v); }
   226     int id(const Edge& e) const { return graph->id(e); }
   227     
   228     Edge opposite(const Edge& e) const { return Edge(graph->opposite(e)); }
   229 
   230 
   231     IMPORT_NODE_MAP(Graph, *(gw.graph), GraphWrapper, gw);    
   232     IMPORT_EDGE_MAP(Graph, *(gw.graph), GraphWrapper, gw);
   233     
   234 
   235   };
   236 
   237 
   238 
   239   /// A graph wrapper which reverses the orientation of the edges.
   240 
   241   ///\warning Graph wrappers are in even more experimental state than the other
   242   ///parts of the lib. Use them at you own risk.
   243   ///
   244   /// Let \f$G=(V, A)\f$ be a directed graph and 
   245   /// suppose that a graph instange \c g of type 
   246   /// \c ListGraph implements \f$G\f$.
   247   /// \code
   248   /// ListGraph g;
   249   /// \endcode
   250   /// For each directed edge 
   251   /// \f$e\in A\f$, let \f$\bar e\f$ denote the edge obtained by 
   252   /// reversing its orientation. 
   253   /// Then RevGraphWrapper implements the graph structure with node-set 
   254   /// \f$V\f$ and edge-set 
   255   /// \f$\{\bar e : e\in A \}\f$, i.e. the graph obtained from \f$G\f$ be 
   256   /// reversing the orientation of its edges. The following code shows how 
   257   /// such an instance can be constructed.
   258   /// \code
   259   /// RevGraphWrapper<ListGraph> gw(g);
   260   /// \endcode
   261   ///\author Marton Makai
   262   template<typename Graph>
   263   class RevGraphWrapper : public GraphWrapper<Graph> {
   264   public:
   265     typedef GraphWrapper<Graph> Parent; 
   266   protected:
   267     RevGraphWrapper() : GraphWrapper<Graph>() { }
   268   public:
   269     RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }  
   270     RevGraphWrapper(const RevGraphWrapper<Graph>& gw) : Parent(gw) { }
   271 
   272     typedef typename GraphWrapper<Graph>::Node Node;
   273     typedef typename GraphWrapper<Graph>::Edge Edge;
   274     //remark: OutEdgeIt and InEdgeIt cannot be typedef-ed to each other
   275     //because this does not work is some of them are not defined in the 
   276     //original graph. The problem with this is that typedef-ed stuff 
   277     //are instantiated in c++.
   278     class OutEdgeIt : public Edge { 
   279       const RevGraphWrapper<Graph>* gw;
   280       friend class GraphWrapper<Graph>;
   281      public:
   282       OutEdgeIt() { }
   283       OutEdgeIt(Invalid i) : Edge(i) { }
   284       OutEdgeIt(const RevGraphWrapper<Graph>& _gw, const Node& n) : 
   285 	Edge(typename Graph::InEdgeIt(*(_gw.graph), n)), gw(&_gw) { }
   286       OutEdgeIt(const RevGraphWrapper<Graph>& _gw, const Edge& e) : 
   287 	Edge(e), gw(&_gw) { }
   288       OutEdgeIt& operator++() { 
   289 	*(static_cast<Edge*>(this))=
   290 	  ++(typename Graph::InEdgeIt(*(gw->graph), *this));
   291 	return *this; 
   292       }
   293     };
   294     class InEdgeIt : public Edge { 
   295       const RevGraphWrapper<Graph>* gw;
   296       friend class GraphWrapper<Graph>;
   297      public:
   298       InEdgeIt() { }
   299       InEdgeIt(Invalid i) : Edge(i) { }
   300       InEdgeIt(const RevGraphWrapper<Graph>& _gw, const Node& n) : 
   301 	Edge(typename Graph::OutEdgeIt(*(_gw.graph), n)), gw(&_gw) { }
   302       InEdgeIt(const RevGraphWrapper<Graph>& _gw, const Edge& e) : 
   303 	Edge(e), gw(&_gw) { }
   304       InEdgeIt& operator++() { 
   305 	*(static_cast<Edge*>(this))=
   306 	  ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
   307 	return *this; 
   308       }
   309     };
   310 
   311     using GraphWrapper<Graph>::first;
   312     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
   313       i=OutEdgeIt(*this, p); return i;
   314     }
   315     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
   316       i=InEdgeIt(*this, p); return i;
   317     }
   318 
   319     Node tail(const Edge& e) const { 
   320       return GraphWrapper<Graph>::head(e); }
   321     Node head(const Edge& e) const { 
   322       return GraphWrapper<Graph>::tail(e); }
   323 
   324     //    KEEP_MAPS(Parent, RevGraphWrapper);
   325 
   326   };
   327 
   328 
   329 
   330   /*! \brief A graph wrapper for hiding nodes and edges from a graph.
   331   
   332   \warning Graph wrappers are in even more experimental state than the other
   333   parts of the lib. Use them at you own risk.
   334   
   335   This wrapper shows a graph with filtered node-set and 
   336   edge-set. 
   337   Given a bool-valued map on the node-set and one on 
   338   the edge-set of the graph, the iterators show only the objects 
   339   having true value. We have to note that this does not mean that an 
   340   induced subgraph is obtained, the node-iterator cares only the filter 
   341   on the node-set, and the edge-iterators care only the filter on the 
   342   edge-set.
   343   \code
   344   typedef SmartGraph Graph;
   345   Graph g;
   346   typedef Graph::Node Node;
   347   typedef Graph::Edge Edge;
   348   Node u=g.addNode(); //node of id 0
   349   Node v=g.addNode(); //node of id 1
   350   Node e=g.addEdge(u, v); //edge of id 0
   351   Node f=g.addEdge(v, u); //edge of id 1
   352   Graph::NodeMap<bool> nm(g, true);
   353   nm.set(u, false);
   354   Graph::EdgeMap<bool> em(g, true);
   355   em.set(e, false);
   356   typedef SubGraphWrapper<Graph, Graph::NodeMap<bool>, Graph::EdgeMap<bool> > SubGW;
   357   SubGW gw(g, nm, em);
   358   for (SubGW::NodeIt n(gw); n!=INVALID; ++n) std::cout << g.id(n) << std::endl;
   359   std::cout << ":-)" << std::endl;
   360   for (SubGW::EdgeIt e(gw); e!=INVALID; ++e) std::cout << g.id(e) << std::endl;
   361   \endcode
   362   The output of the above code is the following.
   363   \code
   364   1
   365   :-)
   366   1
   367   \endcode
   368   Note that \c n is of type \c SubGW::NodeIt, but it can be converted to
   369   \c Graph::Node that is why \c g.id(n) can be applied.
   370 
   371   For other examples see also the documentation of NodeSubGraphWrapper and 
   372   EdgeSubGraphWrapper.
   373 
   374   \author Marton Makai
   375   */
   376   template<typename Graph, typename NodeFilterMap, 
   377 	   typename EdgeFilterMap>
   378   class SubGraphWrapper : public GraphWrapper<Graph> {
   379   public:
   380     typedef GraphWrapper<Graph> Parent;
   381   protected:
   382     NodeFilterMap* node_filter_map;
   383     EdgeFilterMap* edge_filter_map;
   384 
   385     SubGraphWrapper() : GraphWrapper<Graph>(), 
   386 			node_filter_map(0), edge_filter_map(0) { }
   387     void setNodeFilterMap(NodeFilterMap& _node_filter_map) {
   388       node_filter_map=&_node_filter_map;
   389     }
   390     void setEdgeFilterMap(EdgeFilterMap& _edge_filter_map) {
   391       edge_filter_map=&_edge_filter_map;
   392     }
   393     
   394   public:
   395     SubGraphWrapper(Graph& _graph, NodeFilterMap& _node_filter_map, 
   396 		    EdgeFilterMap& _edge_filter_map) : 
   397       GraphWrapper<Graph>(_graph), node_filter_map(&_node_filter_map), 
   398       edge_filter_map(&_edge_filter_map) { }  
   399 
   400     typedef typename GraphWrapper<Graph>::Node Node;
   401     class NodeIt : public Node { 
   402       const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>* gw;
   403       friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
   404     public:
   405       NodeIt() { }
   406       NodeIt(Invalid i) : Node(i) { }
   407       NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _gw) : 
   408 	Node(typename Graph::NodeIt(*(_gw.graph))), gw(&_gw) { 
   409 	while (*static_cast<Node*>(this)!=INVALID && 
   410 	       !(*(gw->node_filter_map))[*this]) 
   411 	  *(static_cast<Node*>(this))=
   412 	    ++(typename Graph::NodeIt(*(gw->graph), *this));
   413       }
   414       NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _gw, 
   415 	     const Node& n) : 
   416 	Node(n), gw(&_gw) { }
   417       NodeIt& operator++() { 
   418 	*(static_cast<Node*>(this))=
   419 	  ++(typename Graph::NodeIt(*(gw->graph), *this));
   420 	while (*static_cast<Node*>(this)!=INVALID && 
   421 	       !(*(gw->node_filter_map))[*this]) 
   422 	  *(static_cast<Node*>(this))=
   423 	    ++(typename Graph::NodeIt(*(gw->graph), *this));
   424 	return *this; 
   425       }
   426     };
   427     typedef typename GraphWrapper<Graph>::Edge Edge;
   428     class OutEdgeIt : public Edge { 
   429       const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>* gw;
   430       friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
   431     public:
   432       OutEdgeIt() { }
   433       OutEdgeIt(Invalid i) : Edge(i) { }
   434       OutEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _gw, const Node& n) : 
   435 	Edge(typename Graph::OutEdgeIt(*(_gw.graph), n)), gw(&_gw) { 
   436 	while (*static_cast<Edge*>(this)!=INVALID && 
   437 	       !(*(gw->edge_filter_map))[*this]) 
   438 	  *(static_cast<Edge*>(this))=
   439 	    ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
   440       }
   441       OutEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _gw, 
   442 	     const Edge& e) : 
   443 	Edge(e), gw(&_gw) { }
   444       OutEdgeIt& operator++() { 
   445 	*(static_cast<Edge*>(this))=
   446 	  ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
   447 	while (*static_cast<Edge*>(this)!=INVALID && 
   448 	       !(*(gw->edge_filter_map))[*this]) 
   449 	  *(static_cast<Edge*>(this))=
   450 	    ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
   451 	return *this; 
   452       }
   453     };
   454     class InEdgeIt : public Edge { 
   455       const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>* gw;
   456       friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
   457     public:
   458       InEdgeIt() { }
   459       //      InEdgeIt(const InEdgeIt& e) : Edge(e), gw(e.gw) { }
   460       InEdgeIt(Invalid i) : Edge(i) { }
   461       InEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _gw, const Node& n) : 
   462 	Edge(typename Graph::InEdgeIt(*(_gw.graph), n)), gw(&_gw) { 
   463 	while (*static_cast<Edge*>(this)!=INVALID && 
   464 	       !(*(gw->edge_filter_map))[*this]) 
   465 	  *(static_cast<Edge*>(this))=
   466 	    ++(typename Graph::InEdgeIt(*(gw->graph), *this));
   467       }
   468       InEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _gw, 
   469 	     const Edge& e) : 
   470 	Edge(e), gw(&_gw) { }
   471       InEdgeIt& operator++() { 
   472 	*(static_cast<Edge*>(this))=
   473 	  ++(typename Graph::InEdgeIt(*(gw->graph), *this));
   474 	while (*static_cast<Edge*>(this)!=INVALID && 
   475 	       !(*(gw->edge_filter_map))[*this]) 
   476 	  *(static_cast<Edge*>(this))=
   477 	    ++(typename Graph::InEdgeIt(*(gw->graph), *this));
   478 	return *this; 
   479       }
   480     };
   481     class EdgeIt : public Edge { 
   482       const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>* gw;
   483       friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
   484     public:
   485       EdgeIt() { }
   486       EdgeIt(Invalid i) : Edge(i) { }
   487       EdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _gw) : 
   488 	Edge(typename Graph::EdgeIt(*(_gw.graph))), gw(&_gw) { 
   489 	while (*static_cast<Edge*>(this)!=INVALID && 
   490 	       !(*(gw->edge_filter_map))[*this]) 
   491 	  *(static_cast<Edge*>(this))=
   492 	    ++(typename Graph::EdgeIt(*(gw->graph), *this));
   493       }
   494       EdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _gw, 
   495 	     const Edge& e) : 
   496 	Edge(e), gw(&_gw) { }
   497       EdgeIt& operator++() { 
   498 	*(static_cast<Edge*>(this))=
   499 	  ++(typename Graph::EdgeIt(*(gw->graph), *this));
   500 	while (*static_cast<Edge*>(this)!=INVALID && 
   501 	       !(*(gw->edge_filter_map))[*this]) 
   502 	  *(static_cast<Edge*>(this))=
   503 	    ++(typename Graph::EdgeIt(*(gw->graph), *this));
   504 	return *this; 
   505       }
   506     };
   507 
   508     NodeIt& first(NodeIt& i) const { 
   509       i=NodeIt(*this); return i;
   510     }
   511     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
   512       i=OutEdgeIt(*this, p); return i;
   513     }
   514     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
   515       i=InEdgeIt(*this, p); return i;
   516     }
   517     EdgeIt& first(EdgeIt& i) const { 
   518       i=EdgeIt(*this); return i;
   519     }
   520     
   521     /// This function hides \c n in the graph, i.e. the iteration 
   522     /// jumps over it. This is done by simply setting the value of \c n  
   523     /// to be false in the corresponding node-map.
   524     void hide(const Node& n) const { node_filter_map->set(n, false); }
   525 
   526     /// This function hides \c e in the graph, i.e. the iteration 
   527     /// jumps over it. This is done by simply setting the value of \c e  
   528     /// to be false in the corresponding edge-map.
   529     void hide(const Edge& e) const { edge_filter_map->set(e, false); }
   530 
   531     /// The value of \c n is set to be true in the node-map which stores 
   532     /// hide information. If \c n was hidden previuosly, then it is shown 
   533     /// again
   534      void unHide(const Node& n) const { node_filter_map->set(n, true); }
   535 
   536     /// The value of \c e is set to be true in the edge-map which stores 
   537     /// hide information. If \c e was hidden previuosly, then it is shown 
   538     /// again
   539     void unHide(const Edge& e) const { edge_filter_map->set(e, true); }
   540 
   541     /// Returns true if \c n is hidden.
   542     bool hidden(const Node& n) const { return !(*node_filter_map)[n]; }
   543 
   544     /// Returns true if \c n is hidden.
   545     bool hidden(const Edge& e) const { return !(*edge_filter_map)[e]; }
   546 
   547     /// \warning This is a linear time operation and works only if 
   548     /// \c Graph::NodeIt is defined.
   549     int nodeNum() const { 
   550       int i=0;
   551       for (NodeIt n(*this); n!=INVALID; ++n) ++i;
   552       return i; 
   553     }
   554 
   555     /// \warning This is a linear time operation and works only if 
   556     /// \c Graph::EdgeIt is defined.
   557     int edgeNum() const { 
   558       int i=0;
   559       for (EdgeIt e(*this); e!=INVALID; ++e) ++i;
   560       return i; 
   561     }
   562 
   563     //    KEEP_MAPS(Parent, SubGraphWrapper);
   564   };
   565 
   566 
   567   /*! \brief A wrapper for hiding nodes from a graph.
   568 
   569   \warning Graph wrappers are in even more experimental state than the other
   570   parts of the lib. Use them at you own risk.
   571   
   572   A wrapper for hiding nodes from a graph.
   573   This wrapper specializes SubGraphWrapper in the way that only the node-set 
   574   can be filtered. Note that this does not mean of considering induced 
   575   subgraph, the edge-iterators consider the original edge-set.
   576   \author Marton Makai
   577   */
   578   template<typename Graph, typename NodeFilterMap>
   579   class NodeSubGraphWrapper : 
   580     public SubGraphWrapper<Graph, NodeFilterMap, 
   581 			   ConstMap<typename Graph::Edge,bool> > {
   582   public:
   583     typedef SubGraphWrapper<Graph, NodeFilterMap, 
   584 			    ConstMap<typename Graph::Edge,bool> > Parent;
   585   protected:
   586     ConstMap<typename Graph::Edge, bool> const_true_map;
   587   public:
   588     NodeSubGraphWrapper(Graph& _graph, NodeFilterMap& _node_filter_map) : 
   589       Parent(), const_true_map(true) { 
   590       Parent::setGraph(_graph);
   591       Parent::setNodeFilterMap(_node_filter_map);
   592       Parent::setEdgeFilterMap(const_true_map);
   593     }
   594   };
   595 
   596 
   597   /*! \brief A wrapper for hiding edges from a graph.
   598 
   599   \warning Graph wrappers are in even more experimental state than the other
   600   parts of the lib. Use them at you own risk.
   601   
   602   A wrapper for hiding edges from a graph.
   603   This wrapper specializes SubGraphWrapper in the way that only the edge-set 
   604   can be filtered. The usefulness of this wrapper is demonstrated in the 
   605   problem of searching a maximum number of edge-disjoint shortest paths 
   606   between 
   607   two nodes \c s and \c t. Shortest here means being shortest w.r.t. 
   608   non-negative edge-lengths. Note that 
   609   the comprehension of the presented solution 
   610   need's some knowledge from elementary combinatorial optimization. 
   611 
   612   If a single shortest path is to be 
   613   searched between two nodes \c s and \c t, then this can be done easily by 
   614   applying the Dijkstra algorithm class. What happens, if a maximum number of 
   615   edge-disjoint shortest paths is to be computed. It can be proved that an 
   616   edge can be in a shortest path if and only if it is tight with respect to 
   617   the potential function computed by Dijkstra. Moreover, any path containing 
   618   only such edges is a shortest one. Thus we have to compute a maximum number 
   619   of edge-disjoint paths between \c s and \c t in the graph which has edge-set 
   620   all the tight edges. The computation will be demonstrated on the following 
   621   graph, which is read from a dimacs file.
   622   
   623   \dot
   624   digraph lemon_dot_example {
   625   node [ shape=ellipse, fontname=Helvetica, fontsize=10 ];
   626   n0 [ label="0 (s)" ];
   627   n1 [ label="1" ];
   628   n2 [ label="2" ];
   629   n3 [ label="3" ];
   630   n4 [ label="4" ];
   631   n5 [ label="5" ];
   632   n6 [ label="6 (t)" ];
   633   edge [ shape=ellipse, fontname=Helvetica, fontsize=10 ];
   634   n5 ->  n6 [ label="9, length:4" ];
   635   n4 ->  n6 [ label="8, length:2" ];
   636   n3 ->  n5 [ label="7, length:1" ];
   637   n2 ->  n5 [ label="6, length:3" ];
   638   n2 ->  n6 [ label="5, length:5" ];
   639   n2 ->  n4 [ label="4, length:2" ];
   640   n1 ->  n4 [ label="3, length:3" ];
   641   n0 ->  n3 [ label="2, length:1" ];
   642   n0 ->  n2 [ label="1, length:2" ];
   643   n0 ->  n1 [ label="0, length:3" ];
   644   }
   645   \enddot
   646 
   647   \code
   648   Graph g;
   649   Node s, t;
   650   LengthMap length(g);
   651 
   652   readDimacs(std::cin, g, length, s, t);
   653 
   654   cout << "edges with lengths (of form id, tail--length->head): " << endl;
   655   for(EdgeIt e(g); e!=INVALID; ++e) 
   656     cout << g.id(e) << ", " << g.id(g.tail(e)) << "--" 
   657          << length[e] << "->" << g.id(g.head(e)) << endl;
   658 
   659   cout << "s: " << g.id(s) << " t: " << g.id(t) << endl;
   660   \endcode
   661   Next, the potential function is computed with Dijkstra.
   662   \code
   663   typedef Dijkstra<Graph, LengthMap> Dijkstra;
   664   Dijkstra dijkstra(g, length);
   665   dijkstra.run(s);
   666   \endcode
   667   Next, we consrtruct a map which filters the edge-set to the tight edges.
   668   \code
   669   typedef TightEdgeFilterMap<Graph, const Dijkstra::DistMap, LengthMap> 
   670     TightEdgeFilter;
   671   TightEdgeFilter tight_edge_filter(g, dijkstra.distMap(), length);
   672   
   673   typedef EdgeSubGraphWrapper<Graph, TightEdgeFilter> SubGW;
   674   SubGW gw(g, tight_edge_filter);
   675   \endcode
   676   Then, the maximum nimber of edge-disjoint \c s-\c t paths are computed 
   677   with a max flow algorithm Preflow.
   678   \code
   679   ConstMap<Edge, int> const_1_map(1);
   680   Graph::EdgeMap<int> flow(g, 0);
   681 
   682   Preflow<SubGW, int, ConstMap<Edge, int>, Graph::EdgeMap<int> > 
   683     preflow(gw, s, t, const_1_map, flow);
   684   preflow.run();
   685   \endcode
   686   Last, the output is:
   687   \code  
   688   cout << "maximum number of edge-disjoint shortest path: " 
   689        << preflow.flowValue() << endl;
   690   cout << "edges of the maximum number of edge-disjoint shortest s-t paths: " 
   691        << endl;
   692   for(EdgeIt e(g); e!=INVALID; ++e) 
   693     if (flow[e])
   694       cout << " " << g.id(g.tail(e)) << "--" 
   695 	   << length[e] << "->" << g.id(g.head(e)) << endl;
   696   \endcode
   697   The program has the following (expected :-)) output:
   698   \code
   699   edges with lengths (of form id, tail--length->head):
   700    9, 5--4->6
   701    8, 4--2->6
   702    7, 3--1->5
   703    6, 2--3->5
   704    5, 2--5->6
   705    4, 2--2->4
   706    3, 1--3->4
   707    2, 0--1->3
   708    1, 0--2->2
   709    0, 0--3->1
   710   s: 0 t: 6
   711   maximum number of edge-disjoint shortest path: 2
   712   edges of the maximum number of edge-disjoint shortest s-t paths:
   713    9, 5--4->6
   714    8, 4--2->6
   715    7, 3--1->5
   716    4, 2--2->4
   717    2, 0--1->3
   718    1, 0--2->2
   719   \endcode
   720 
   721   \author Marton Makai
   722   */
   723   template<typename Graph, typename EdgeFilterMap>
   724   class EdgeSubGraphWrapper : 
   725     public SubGraphWrapper<Graph, ConstMap<typename Graph::Node,bool>, 
   726 			   EdgeFilterMap> {
   727   public:
   728     typedef SubGraphWrapper<Graph, ConstMap<typename Graph::Node,bool>, 
   729 			    EdgeFilterMap> Parent;
   730   protected:
   731     ConstMap<typename Graph::Node, bool> const_true_map;
   732   public:
   733     EdgeSubGraphWrapper(Graph& _graph, EdgeFilterMap& _edge_filter_map) : 
   734       Parent(), const_true_map(true) { 
   735       Parent::setGraph(_graph);
   736       Parent::setNodeFilterMap(const_true_map);
   737       Parent::setEdgeFilterMap(_edge_filter_map);
   738     }
   739   };
   740 
   741 
   742   template<typename Graph>
   743   class UndirGraphWrapper : public GraphWrapper<Graph> {
   744   public:
   745     typedef GraphWrapper<Graph> Parent; 
   746   protected:
   747     UndirGraphWrapper() : GraphWrapper<Graph>() { }
   748     
   749   public:
   750     typedef typename GraphWrapper<Graph>::Node Node;
   751     typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
   752     typedef typename GraphWrapper<Graph>::Edge Edge;
   753     typedef typename GraphWrapper<Graph>::EdgeIt EdgeIt;
   754 
   755     UndirGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }  
   756 
   757     class OutEdgeIt {
   758       friend class UndirGraphWrapper<Graph>;
   759       bool out_or_in; //true iff out
   760       typename Graph::OutEdgeIt out;
   761       typename Graph::InEdgeIt in;
   762     public:
   763       OutEdgeIt() { }
   764       OutEdgeIt(const Invalid& i) : Edge(i) { }
   765       OutEdgeIt(const UndirGraphWrapper<Graph>& _G, const Node& _n) {
   766 	out_or_in=true; _G.graph->first(out, _n);
   767 	if (!(_G.graph->valid(out))) { out_or_in=false; _G.graph->first(in, _n);	}
   768       } 
   769       operator Edge() const { 
   770 	if (out_or_in) return Edge(out); else return Edge(in); 
   771       }
   772     };
   773 
   774     typedef OutEdgeIt InEdgeIt; 
   775 
   776     using GraphWrapper<Graph>::first;
   777     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
   778       i=OutEdgeIt(*this, p); return i;
   779     }
   780 
   781     using GraphWrapper<Graph>::next;
   782 
   783     OutEdgeIt& next(OutEdgeIt& e) const {
   784       if (e.out_or_in) {
   785 	typename Graph::Node n=this->graph->tail(e.out);
   786 	this->graph->next(e.out);
   787 	if (!this->graph->valid(e.out)) { 
   788 	  e.out_or_in=false; this->graph->first(e.in, n); }
   789       } else {
   790 	this->graph->next(e.in);
   791       }
   792       return e;
   793     }
   794 
   795     Node aNode(const OutEdgeIt& e) const { 
   796       if (e.out_or_in) return this->graph->tail(e); else 
   797 	return this->graph->head(e); }
   798     Node bNode(const OutEdgeIt& e) const { 
   799       if (e.out_or_in) return this->graph->head(e); else 
   800 	return this->graph->tail(e); }
   801 
   802     //    KEEP_MAPS(Parent, UndirGraphWrapper);
   803 
   804   };
   805   
   806 //   /// \brief An undirected graph template.
   807 //   ///
   808 //   ///\warning Graph wrappers are in even more experimental state than the other
   809 //   ///parts of the lib. Use them at your own risk.
   810 //   ///
   811 //   /// An undirected graph template.
   812 //   /// This class works as an undirected graph and a directed graph of 
   813 //   /// class \c Graph is used for the physical storage.
   814 //   /// \ingroup graphs
   815   template<typename Graph>
   816   class UndirGraph : public UndirGraphWrapper<Graph> {
   817     typedef UndirGraphWrapper<Graph> Parent;
   818   protected:
   819     Graph gr;
   820   public:
   821     UndirGraph() : UndirGraphWrapper<Graph>() { 
   822       Parent::setGraph(gr); 
   823     }
   824 
   825     //    KEEP_MAPS(Parent, UndirGraph);
   826   };
   827 
   828 
   829 
   830   ///\brief A wrapper for composing a subgraph of a 
   831   /// bidirected graph made from a directed one. 
   832   ///
   833   /// A wrapper for composing a subgraph of a 
   834   /// bidirected graph made from a directed one. 
   835   ///
   836   ///\warning Graph wrappers are in even more experimental state than the other
   837   ///parts of the lib. Use them at you own risk.
   838   ///
   839   /// Let \f$G=(V, A)\f$ be a directed graph and for each directed edge 
   840   /// \f$e\in A\f$, let \f$\bar e\f$ denote the edge obtained by
   841   /// reversing its orientation. We are given moreover two bool valued 
   842   /// maps on the edge-set, 
   843   /// \f$forward\_filter\f$, and \f$backward\_filter\f$. 
   844   /// SubBidirGraphWrapper implements the graph structure with node-set 
   845   /// \f$V\f$ and edge-set 
   846   /// \f$\{e : e\in A \mbox{ and } forward\_filter(e) \mbox{ is true}\}+\{\bar e : e\in A \mbox{ and } backward\_filter(e) \mbox{ is true}\}\f$. 
   847   /// The purpose of writing + instead of union is because parallel 
   848   /// edges can arise. (Similarly, antiparallel edges also can arise).
   849   /// In other words, a subgraph of the bidirected graph obtained, which 
   850   /// is given by orienting the edges of the original graph in both directions.
   851   /// As the oppositely directed edges are logically different, 
   852   /// the maps are able to attach different values for them. 
   853   ///
   854   /// An example for such a construction is \c RevGraphWrapper where the 
   855   /// forward_filter is everywhere false and the backward_filter is 
   856   /// everywhere true. We note that for sake of efficiency, 
   857   /// \c RevGraphWrapper is implemented in a different way. 
   858   /// But BidirGraphWrapper is obtained from 
   859   /// SubBidirGraphWrapper by considering everywhere true 
   860   /// valued maps both for forward_filter and backward_filter. 
   861   /// Finally, one of the most important applications of SubBidirGraphWrapper 
   862   /// is ResGraphWrapper, which stands for the residual graph in directed 
   863   /// flow and circulation problems. 
   864   /// As wrappers usually, the SubBidirGraphWrapper implements the 
   865   /// above mentioned graph structure without its physical storage, 
   866   /// that is the whole stuff is stored in constant memory. 
   867   template<typename Graph, 
   868 	   typename ForwardFilterMap, typename BackwardFilterMap>
   869   class SubBidirGraphWrapper : public GraphWrapper<Graph> {
   870   public:
   871     typedef GraphWrapper<Graph> Parent; 
   872   protected:
   873     ForwardFilterMap* forward_filter;
   874     BackwardFilterMap* backward_filter;
   875 
   876     SubBidirGraphWrapper() : GraphWrapper<Graph>() { }
   877     void setForwardFilterMap(ForwardFilterMap& _forward_filter) {
   878       forward_filter=&_forward_filter;
   879     }
   880     void setBackwardFilterMap(BackwardFilterMap& _backward_filter) {
   881       backward_filter=&_backward_filter;
   882     }
   883 
   884   public:
   885 
   886     SubBidirGraphWrapper(Graph& _graph, ForwardFilterMap& _forward_filter, 
   887 			 BackwardFilterMap& _backward_filter) : 
   888       GraphWrapper<Graph>(_graph), 
   889       forward_filter(&_forward_filter), backward_filter(&_backward_filter) { }
   890     SubBidirGraphWrapper(const SubBidirGraphWrapper<Graph, 
   891 			 ForwardFilterMap, BackwardFilterMap>& gw) : 
   892       Parent(gw), 
   893       forward_filter(gw.forward_filter), 
   894       backward_filter(gw.backward_filter) { }
   895 
   896     class Edge; 
   897     class OutEdgeIt; 
   898     friend class Edge; 
   899     friend class OutEdgeIt; 
   900 
   901     template<typename T> class EdgeMap;
   902 
   903     typedef typename GraphWrapper<Graph>::Node Node;
   904 
   905     typedef typename Graph::Edge GraphEdge;
   906     /// SubBidirGraphWrapper<..., ..., ...>::Edge is inherited from 
   907     /// Graph::Edge. It contains an extra bool flag which is true 
   908     /// if and only if the 
   909     /// edge is the backward version of the original edge.
   910     class Edge : public Graph::Edge {
   911       friend class SubBidirGraphWrapper<Graph, 
   912 					ForwardFilterMap, BackwardFilterMap>;
   913       template<typename T> friend class EdgeMap;
   914     protected:
   915       bool backward; //true, iff backward
   916     public:
   917       Edge() { }
   918       /// \todo =false is needed, or causes problems?
   919       /// If \c _backward is false, then we get an edge corresponding to the 
   920       /// original one, otherwise its oppositely directed pair is obtained.
   921       Edge(const typename Graph::Edge& e, bool _backward/*=false*/) : 
   922 	Graph::Edge(e), backward(_backward) { }
   923       Edge(Invalid i) : Graph::Edge(i), backward(true) { }
   924       bool operator==(const Edge& v) const { 
   925 	return (this->backward==v.backward && 
   926 		static_cast<typename Graph::Edge>(*this)==
   927 		static_cast<typename Graph::Edge>(v));
   928       } 
   929       bool operator!=(const Edge& v) const { 
   930 	return (this->backward!=v.backward || 
   931 		static_cast<typename Graph::Edge>(*this)!=
   932 		static_cast<typename Graph::Edge>(v));
   933       }
   934     };
   935 
   936     class OutEdgeIt : public Edge {
   937       friend class SubBidirGraphWrapper<Graph, 
   938 					ForwardFilterMap, BackwardFilterMap>;
   939     protected:
   940       const SubBidirGraphWrapper<Graph, 
   941 				 ForwardFilterMap, BackwardFilterMap>* gw;
   942     public:
   943       OutEdgeIt() { }
   944       OutEdgeIt(Invalid i) : Edge(i) { }
   945       OutEdgeIt(const SubBidirGraphWrapper<Graph, 
   946 		ForwardFilterMap, BackwardFilterMap>& _gw, const Node& n) : 
   947 	Edge(typename Graph::OutEdgeIt(*(_gw.graph), n), false), gw(&_gw) { 
   948 	while (*static_cast<GraphEdge*>(this)!=INVALID && 
   949 	       !(*(gw->forward_filter))[*this]) 
   950 	  *(static_cast<GraphEdge*>(this))=
   951 	    ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
   952 	if (*static_cast<GraphEdge*>(this)==INVALID) {
   953 	  *static_cast<Edge*>(this)=
   954 	    Edge(typename Graph::InEdgeIt(*(_gw.graph), n), true);
   955 	  while (*static_cast<GraphEdge*>(this)!=INVALID && 
   956 		 !(*(gw->backward_filter))[*this]) 
   957 	    *(static_cast<GraphEdge*>(this))=
   958 	      ++(typename Graph::InEdgeIt(*(gw->graph), *this));
   959 	}
   960       }
   961       OutEdgeIt(const SubBidirGraphWrapper<Graph, 
   962 		ForwardFilterMap, BackwardFilterMap>& _gw, const Edge& e) : 
   963 	Edge(e), gw(&_gw) { }
   964       OutEdgeIt& operator++() { 
   965 	if (!this->backward) {
   966 	  Node n=gw->tail(*this);
   967 	  *(static_cast<GraphEdge*>(this))=
   968 	    ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
   969 	  while (*static_cast<GraphEdge*>(this)!=INVALID && 
   970 		 !(*(gw->forward_filter))[*this]) 
   971 	    *(static_cast<GraphEdge*>(this))=
   972 	      ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
   973 	  if (*static_cast<GraphEdge*>(this)==INVALID) {
   974 	    *static_cast<Edge*>(this)=
   975 	      Edge(typename Graph::InEdgeIt(*(gw->graph), n), true);
   976 	    while (*static_cast<GraphEdge*>(this)!=INVALID && 
   977 		   !(*(gw->backward_filter))[*this]) 
   978 	      *(static_cast<GraphEdge*>(this))=
   979 		++(typename Graph::InEdgeIt(*(gw->graph), *this));
   980 	  }
   981 	} else {
   982 	  *(static_cast<GraphEdge*>(this))=
   983 	    ++(typename Graph::InEdgeIt(*(gw->graph), *this));
   984 	  while (*static_cast<GraphEdge*>(this)!=INVALID && 
   985 		 !(*(gw->backward_filter))[*this]) 
   986 	    *(static_cast<GraphEdge*>(this))=
   987 	      ++(typename Graph::InEdgeIt(*(gw->graph), *this));
   988 	}
   989 	return *this;
   990       }
   991     };
   992 
   993     class InEdgeIt : public Edge {
   994       friend class SubBidirGraphWrapper<Graph, 
   995 					ForwardFilterMap, BackwardFilterMap>;
   996     protected:
   997       const SubBidirGraphWrapper<Graph, 
   998 				 ForwardFilterMap, BackwardFilterMap>* gw;
   999     public:
  1000       InEdgeIt() { }
  1001       InEdgeIt(Invalid i) : Edge(i) { }
  1002       InEdgeIt(const SubBidirGraphWrapper<Graph, 
  1003 	       ForwardFilterMap, BackwardFilterMap>& _gw, const Node& n) : 
  1004 	Edge(typename Graph::InEdgeIt(*(_gw.graph), n), false), gw(&_gw) { 
  1005 	while (*static_cast<GraphEdge*>(this)!=INVALID && 
  1006 	       !(*(gw->forward_filter))[*this]) 
  1007 	  *(static_cast<GraphEdge*>(this))=
  1008 	    ++(typename Graph::InEdgeIt(*(gw->graph), *this));
  1009 	if (*static_cast<GraphEdge*>(this)==INVALID) {
  1010 	  *static_cast<Edge*>(this)=
  1011 	    Edge(typename Graph::OutEdgeIt(*(_gw.graph), n), true);
  1012 	  while (*static_cast<GraphEdge*>(this)!=INVALID && 
  1013 		 !(*(gw->backward_filter))[*this]) 
  1014 	    *(static_cast<GraphEdge*>(this))=
  1015 	      ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
  1016 	}
  1017       }
  1018       InEdgeIt(const SubBidirGraphWrapper<Graph, 
  1019 	       ForwardFilterMap, BackwardFilterMap>& _gw, const Edge& e) : 
  1020 	Edge(e), gw(&_gw) { }
  1021       InEdgeIt& operator++() { 
  1022 	if (!this->backward) {
  1023 	  Node n=gw->tail(*this);
  1024 	  *(static_cast<GraphEdge*>(this))=
  1025 	    ++(typename Graph::InEdgeIt(*(gw->graph), *this));
  1026 	  while (*static_cast<GraphEdge*>(this)!=INVALID && 
  1027 		 !(*(gw->forward_filter))[*this]) 
  1028 	    *(static_cast<GraphEdge*>(this))=
  1029 	      ++(typename Graph::InEdgeIt(*(gw->graph), *this));
  1030 	  if (*static_cast<GraphEdge*>(this)==INVALID) {
  1031 	    *static_cast<Edge*>(this)=
  1032 	      Edge(typename Graph::OutEdgeIt(*(gw->graph), n), true);
  1033 	    while (*static_cast<GraphEdge*>(this)!=INVALID && 
  1034 		   !(*(gw->backward_filter))[*this]) 
  1035 	      *(static_cast<GraphEdge*>(this))=
  1036 		++(typename Graph::OutEdgeIt(*(gw->graph), *this));
  1037 	  }
  1038 	} else {
  1039 	  *(static_cast<GraphEdge*>(this))=
  1040 	    ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
  1041 	  while (*static_cast<GraphEdge*>(this)!=INVALID && 
  1042 		 !(*(gw->backward_filter))[*this]) 
  1043 	    *(static_cast<GraphEdge*>(this))=
  1044 	      ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
  1045 	}
  1046 	return *this;
  1047       }
  1048     };
  1049 
  1050     class EdgeIt : public Edge {
  1051       friend class SubBidirGraphWrapper<Graph, 
  1052 					ForwardFilterMap, BackwardFilterMap>;
  1053     protected:
  1054       const SubBidirGraphWrapper<Graph, 
  1055 				 ForwardFilterMap, BackwardFilterMap>* gw;
  1056     public:
  1057       EdgeIt() { }
  1058       EdgeIt(Invalid i) : Edge(i) { }
  1059       EdgeIt(const SubBidirGraphWrapper<Graph, 
  1060 	     ForwardFilterMap, BackwardFilterMap>& _gw) : 
  1061 	Edge(typename Graph::EdgeIt(*(_gw.graph)), false), gw(&_gw) { 
  1062 	while (*static_cast<GraphEdge*>(this)!=INVALID && 
  1063 	       !(*(gw->forward_filter))[*this]) 
  1064 	  *(static_cast<GraphEdge*>(this))=
  1065 	    ++(typename Graph::EdgeIt(*(gw->graph), *this));
  1066 	if (*static_cast<GraphEdge*>(this)==INVALID) {
  1067 	  *static_cast<Edge*>(this)=
  1068 	    Edge(typename Graph::EdgeIt(*(_gw.graph)), true);
  1069 	  while (*static_cast<GraphEdge*>(this)!=INVALID && 
  1070 		 !(*(gw->backward_filter))[*this]) 
  1071 	    *(static_cast<GraphEdge*>(this))=
  1072 	      ++(typename Graph::EdgeIt(*(gw->graph), *this));
  1073 	}
  1074       }
  1075       EdgeIt(const SubBidirGraphWrapper<Graph, 
  1076 	     ForwardFilterMap, BackwardFilterMap>& _gw, const Edge& e) : 
  1077 	Edge(e), gw(&_gw) { }
  1078       EdgeIt& operator++() { 
  1079 	if (!this->backward) {
  1080 	  *(static_cast<GraphEdge*>(this))=
  1081 	    ++(typename Graph::EdgeIt(*(gw->graph), *this));
  1082 	  while (*static_cast<GraphEdge*>(this)!=INVALID && 
  1083 		 !(*(gw->forward_filter))[*this]) 
  1084 	    *(static_cast<GraphEdge*>(this))=
  1085 	      ++(typename Graph::EdgeIt(*(gw->graph), *this));
  1086 	  if (*static_cast<GraphEdge*>(this)==INVALID) {
  1087 	    *static_cast<Edge*>(this)=
  1088 	      Edge(typename Graph::EdgeIt(*(gw->graph)), true);
  1089 	    while (*static_cast<GraphEdge*>(this)!=INVALID && 
  1090 		   !(*(gw->backward_filter))[*this]) 
  1091 	      *(static_cast<GraphEdge*>(this))=
  1092 		++(typename Graph::EdgeIt(*(gw->graph), *this));
  1093 	  }
  1094 	} else {
  1095 	  *(static_cast<GraphEdge*>(this))=
  1096 	    ++(typename Graph::EdgeIt(*(gw->graph), *this));
  1097 	  while (*static_cast<GraphEdge*>(this)!=INVALID && 
  1098 		 !(*(gw->backward_filter))[*this]) 
  1099 	    *(static_cast<GraphEdge*>(this))=
  1100 	      ++(typename Graph::EdgeIt(*(gw->graph), *this));
  1101 	}
  1102 	return *this;
  1103       }
  1104     };
  1105 
  1106     using GraphWrapper<Graph>::first;
  1107     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
  1108       i=OutEdgeIt(*this, p); return i;
  1109     }
  1110     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
  1111       i=InEdgeIt(*this, p); return i;
  1112     }
  1113     EdgeIt& first(EdgeIt& i) const { 
  1114       i=EdgeIt(*this); return i;
  1115     }
  1116   
  1117 
  1118     Node tail(Edge e) const { 
  1119       return ((!e.backward) ? this->graph->tail(e) : this->graph->head(e)); }
  1120     Node head(Edge e) const { 
  1121       return ((!e.backward) ? this->graph->head(e) : this->graph->tail(e)); }
  1122 
  1123     /// Gives back the opposite edge.
  1124     Edge opposite(const Edge& e) const { 
  1125       Edge f=e;
  1126       f.backward=!f.backward;
  1127       return f;
  1128     }
  1129 
  1130     /// \warning This is a linear time operation and works only if 
  1131     /// \c Graph::EdgeIt is defined.
  1132     int edgeNum() const { 
  1133       int i=0;
  1134       for (EdgeIt e(*this); e!=INVALID; ++e) ++i;
  1135       return i; 
  1136     }
  1137 
  1138     bool forward(const Edge& e) const { return !e.backward; }
  1139     bool backward(const Edge& e) const { return e.backward; }
  1140 
  1141 
  1142     template <typename T>
  1143     /// \c SubBidirGraphWrapper<..., ..., ...>::EdgeMap contains two 
  1144     /// Graph::EdgeMap one for the forward edges and 
  1145     /// one for the backward edges.
  1146     class EdgeMap {
  1147       template <typename TT> friend class EdgeMap;
  1148       typename Graph::template EdgeMap<T> forward_map, backward_map; 
  1149     public:
  1150       typedef T ValueType;
  1151       typedef Edge KeyType;
  1152 
  1153       EdgeMap(const SubBidirGraphWrapper<Graph, 
  1154 	      ForwardFilterMap, BackwardFilterMap>& g) : 
  1155 	forward_map(*(g.graph)), backward_map(*(g.graph)) { }
  1156 
  1157       EdgeMap(const SubBidirGraphWrapper<Graph, 
  1158 	      ForwardFilterMap, BackwardFilterMap>& g, T a) : 
  1159 	forward_map(*(g.graph), a), backward_map(*(g.graph), a) { }
  1160 
  1161       template <typename TT>
  1162       EdgeMap(const EdgeMap<TT>& copy) 
  1163 	: forward_map(copy.forward_map), backward_map(copy.backward_map) {}
  1164 
  1165       template <typename TT>
  1166       EdgeMap& operator=(const EdgeMap<TT>& copy) {
  1167 	forward_map = copy.forward_map;
  1168 	backward_map = copy.backward_map;
  1169 	return *this;
  1170       }
  1171       
  1172       void set(Edge e, T a) { 
  1173 	if (!e.backward) 
  1174 	  forward_map.set(e, a); 
  1175 	else 
  1176 	  backward_map.set(e, a); 
  1177       }
  1178 
  1179       typename Graph::template EdgeMap<T>::ConstReferenceType 
  1180       operator[](Edge e) const { 
  1181 	if (!e.backward) 
  1182 	  return forward_map[e]; 
  1183 	else 
  1184 	  return backward_map[e]; 
  1185       }
  1186 
  1187       typename Graph::template EdgeMap<T>::ReferenceType 
  1188       operator[](Edge e) { 
  1189 	if (!e.backward) 
  1190 	  return forward_map[e]; 
  1191 	else 
  1192 	  return backward_map[e]; 
  1193       }
  1194 
  1195       void update() { 
  1196 	forward_map.update(); 
  1197 	backward_map.update();
  1198       }
  1199     };
  1200 
  1201 
  1202     //    KEEP_NODE_MAP(Parent, SubBidirGraphWrapper);
  1203 
  1204   };
  1205 
  1206 
  1207   ///\brief A wrapper for composing bidirected graph from a directed one. 
  1208   ///
  1209   ///\warning Graph wrappers are in even more experimental state than the other
  1210   ///parts of the lib. Use them at you own risk.
  1211   ///
  1212   /// A wrapper for composing bidirected graph from a directed one. 
  1213   /// A bidirected graph is composed over the directed one without physical 
  1214   /// storage. As the oppositely directed edges are logically different ones 
  1215   /// the maps are able to attach different values for them.
  1216   template<typename Graph>
  1217   class BidirGraphWrapper : 
  1218     public SubBidirGraphWrapper<
  1219     Graph, 
  1220     ConstMap<typename Graph::Edge, bool>, 
  1221     ConstMap<typename Graph::Edge, bool> > {
  1222   public:
  1223     typedef  SubBidirGraphWrapper<
  1224       Graph, 
  1225       ConstMap<typename Graph::Edge, bool>, 
  1226       ConstMap<typename Graph::Edge, bool> > Parent; 
  1227   protected:
  1228     ConstMap<typename Graph::Edge, bool> cm;
  1229 
  1230     BidirGraphWrapper() : Parent(), cm(true) { 
  1231       Parent::setForwardFilterMap(cm);
  1232       Parent::setBackwardFilterMap(cm);
  1233     }
  1234   public:
  1235     BidirGraphWrapper(Graph& _graph) : Parent() { 
  1236       Parent::setGraph(_graph);
  1237       Parent::setForwardFilterMap(cm);
  1238       Parent::setBackwardFilterMap(cm);
  1239     }
  1240 
  1241     int edgeNum() const { 
  1242       return 2*this->graph->edgeNum();
  1243     }
  1244     //    KEEP_MAPS(Parent, BidirGraphWrapper);
  1245   };
  1246 
  1247 
  1248   /// \brief A bidirected graph template.
  1249   ///
  1250   ///\warning Graph wrappers are in even more experimental state than the other
  1251   ///parts of the lib. Use them at you own risk.
  1252   ///
  1253   /// A bidirected graph template.
  1254   /// Such a bidirected graph stores each pair of oppositely directed edges 
  1255   /// ones in the memory, i.e. a directed graph of type 
  1256   /// \c Graph is used for that.
  1257   /// As the oppositely directed edges are logically different ones 
  1258   /// the maps are able to attach different values for them.
  1259   /// \ingroup graphs
  1260   template<typename Graph>
  1261   class BidirGraph : public BidirGraphWrapper<Graph> {
  1262   public:
  1263     typedef UndirGraphWrapper<Graph> Parent;
  1264   protected:
  1265     Graph gr;
  1266   public:
  1267     BidirGraph() : BidirGraphWrapper<Graph>() { 
  1268       Parent::setGraph(gr); 
  1269     }
  1270     //    KEEP_MAPS(Parent, BidirGraph);
  1271   };
  1272 
  1273 
  1274 
  1275   template<typename Graph, typename Number,
  1276 	   typename CapacityMap, typename FlowMap>
  1277   class ResForwardFilter {
  1278     //    const Graph* graph;
  1279     const CapacityMap* capacity;
  1280     const FlowMap* flow;
  1281   public:
  1282     ResForwardFilter(/*const Graph& _graph, */
  1283 		     const CapacityMap& _capacity, const FlowMap& _flow) :
  1284       /*graph(&_graph),*/ capacity(&_capacity), flow(&_flow) { }
  1285     ResForwardFilter() : /*graph(0),*/ capacity(0), flow(0) { }
  1286     void setCapacity(const CapacityMap& _capacity) { capacity=&_capacity; }
  1287     void setFlow(const FlowMap& _flow) { flow=&_flow; }
  1288     bool operator[](const typename Graph::Edge& e) const {
  1289       return (Number((*flow)[e]) < Number((*capacity)[e]));
  1290     }
  1291   };
  1292 
  1293   template<typename Graph, typename Number,
  1294 	   typename CapacityMap, typename FlowMap>
  1295   class ResBackwardFilter {
  1296     const CapacityMap* capacity;
  1297     const FlowMap* flow;
  1298   public:
  1299     ResBackwardFilter(/*const Graph& _graph,*/ 
  1300 		      const CapacityMap& _capacity, const FlowMap& _flow) :
  1301       /*graph(&_graph),*/ capacity(&_capacity), flow(&_flow) { }
  1302     ResBackwardFilter() : /*graph(0),*/ capacity(0), flow(0) { }
  1303     void setCapacity(const CapacityMap& _capacity) { capacity=&_capacity; }
  1304     void setFlow(const FlowMap& _flow) { flow=&_flow; }
  1305     bool operator[](const typename Graph::Edge& e) const {
  1306       return (Number(0) < Number((*flow)[e]));
  1307     }
  1308   };
  1309 
  1310   
  1311   /// A wrapper for composing the residual graph for directed flow and circulation problems.
  1312 
  1313   ///\warning Graph wrappers are in even more experimental state than the other
  1314   ///parts of the lib. Use them at you own risk.
  1315   ///
  1316   /// A wrapper for composing the residual graph for directed flow and circulation problems.
  1317   template<typename Graph, typename Number, 
  1318 	   typename CapacityMap, typename FlowMap>
  1319   class ResGraphWrapper : 
  1320     public SubBidirGraphWrapper< 
  1321     Graph, 
  1322     ResForwardFilter<Graph, Number, CapacityMap, FlowMap>,  
  1323     ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> > {
  1324   public:
  1325     typedef SubBidirGraphWrapper< 
  1326       Graph, 
  1327       ResForwardFilter<Graph, Number, CapacityMap, FlowMap>,  
  1328       ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> > Parent;
  1329   protected:
  1330     const CapacityMap* capacity;
  1331     FlowMap* flow;
  1332     ResForwardFilter<Graph, Number, CapacityMap, FlowMap> forward_filter;
  1333     ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> backward_filter;
  1334     ResGraphWrapper() : Parent(), 
  1335  			capacity(0), flow(0) { }
  1336     void setCapacityMap(const CapacityMap& _capacity) {
  1337       capacity=&_capacity;
  1338       forward_filter.setCapacity(_capacity);
  1339       backward_filter.setCapacity(_capacity);
  1340     }
  1341     void setFlowMap(FlowMap& _flow) {
  1342       flow=&_flow;
  1343       forward_filter.setFlow(_flow);
  1344       backward_filter.setFlow(_flow);
  1345     }
  1346   public:
  1347     ResGraphWrapper(Graph& _graph, const CapacityMap& _capacity, 
  1348 		       FlowMap& _flow) : 
  1349       Parent(), capacity(&_capacity), flow(&_flow), 
  1350       forward_filter(/*_graph,*/ _capacity, _flow), 
  1351       backward_filter(/*_graph,*/ _capacity, _flow) {
  1352       Parent::setGraph(_graph);
  1353       Parent::setForwardFilterMap(forward_filter);
  1354       Parent::setBackwardFilterMap(backward_filter);
  1355     }
  1356 
  1357     typedef typename Parent::Edge Edge;
  1358 
  1359     void augment(const Edge& e, Number a) const {
  1360       if (Parent::forward(e))  
  1361 	flow->set(e, (*flow)[e]+a);
  1362       else  
  1363 	flow->set(e, (*flow)[e]-a);
  1364     }
  1365 
  1366     /// \brief Residual capacity map.
  1367     ///
  1368     /// In generic residual graphs the residual capacity can be obtained 
  1369     /// as a map. 
  1370     class ResCap {
  1371     protected:
  1372       const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>* res_graph;
  1373     public:
  1374       typedef Number ValueType;
  1375       typedef Edge KeyType;
  1376       ResCap(const ResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& 
  1377 	     _res_graph) : res_graph(&_res_graph) { }
  1378       Number operator[](const Edge& e) const { 
  1379 	if (res_graph->forward(e)) 
  1380 	  return (*(res_graph->capacity))[e]-(*(res_graph->flow))[e]; 
  1381 	else 
  1382 	  return (*(res_graph->flow))[e]; 
  1383       }
  1384     };
  1385 
  1386     //    KEEP_MAPS(Parent, ResGraphWrapper);
  1387   };
  1388 
  1389 
  1390   /// For blocking flows.
  1391 
  1392   ///\warning Graph wrappers are in even more experimental state than the other
  1393   ///parts of the lib. Use them at you own risk.
  1394   ///
  1395   /// This graph wrapper is used for on-the-fly 
  1396   /// Dinits blocking flow computations.
  1397   /// For each node, an out-edge is stored which is used when the 
  1398   /// \code 
  1399   /// OutEdgeIt& first(OutEdgeIt&, const Node&)
  1400   /// \endcode
  1401   /// is called. 
  1402   ///
  1403   /// \author Marton Makai
  1404   template<typename Graph, typename FirstOutEdgesMap>
  1405   class ErasingFirstGraphWrapper : public GraphWrapper<Graph> {
  1406   public:
  1407     typedef GraphWrapper<Graph> Parent; 
  1408   protected:
  1409     FirstOutEdgesMap* first_out_edges;
  1410   public:
  1411     ErasingFirstGraphWrapper(Graph& _graph, 
  1412 			     FirstOutEdgesMap& _first_out_edges) : 
  1413       GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { }  
  1414 
  1415     typedef typename GraphWrapper<Graph>::Node Node;
  1416     typedef typename GraphWrapper<Graph>::Edge Edge;
  1417     class OutEdgeIt : public Edge { 
  1418       friend class GraphWrapper<Graph>;
  1419       friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
  1420       const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>* gw;
  1421     public:
  1422       OutEdgeIt() { }
  1423       OutEdgeIt(Invalid i) : Edge(i) { }
  1424       OutEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _gw, 
  1425 		const Node& n) : 
  1426 	Edge((*(_gw.first_out_edges))[n]), gw(&_gw) { }
  1427       OutEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _gw, 
  1428 		const Edge& e) : 
  1429 	Edge(e), gw(&_gw) { }
  1430       OutEdgeIt& operator++() { 
  1431 	*(static_cast<Edge*>(this))=
  1432 	  ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
  1433 	return *this; 
  1434       }
  1435     };
  1436 
  1437     using GraphWrapper<Graph>::first;
  1438     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
  1439       i=OutEdgeIt(*this, p); return i;
  1440     }
  1441     void erase(const Edge& e) const {
  1442       Node n=tail(e);
  1443       typename Graph::OutEdgeIt f(*Parent::graph, n);
  1444       ++f;
  1445       first_out_edges->set(n, f);
  1446     }
  1447 
  1448     //    KEEP_MAPS(Parent, ErasingFirstGraphWrapper);
  1449   };
  1450 
  1451   ///@}
  1452 
  1453 } //namespace lemon
  1454 
  1455 #endif //LEMON_GRAPH_WRAPPER_H
  1456