src/hugo/graph_wrapper.h
author marci
Fri, 21 May 2004 08:15:45 +0000
changeset 653 c3ad7c661a49
parent 650 588ff2ca55bd
child 655 a9878222d5c8
permissions -rw-r--r--
misc
     1 // -*- c++ -*-
     2 #ifndef HUGO_GRAPH_WRAPPER_H
     3 #define HUGO_GRAPH_WRAPPER_H
     4 
     5 ///\ingroup gwrappers
     6 ///\file
     7 ///\brief Several graph wrappers.
     8 ///
     9 ///This file contains several useful graph wrapper functions.
    10 ///
    11 ///\author Marton Makai
    12 
    13 #include <hugo/invalid.h>
    14 #include <hugo/maps.h>
    15 //#include <iter_map.h>
    16 
    17 namespace hugo {
    18 
    19   // Graph wrappers
    20 
    21   /// \addtogroup gwrappers
    22   /// A main parts of HUGOlib are the different graph structures, 
    23   /// generic graph algorithms, graph concepts which couple these, and 
    24   /// graph wrappers. While the previous ones are more or less clear, the 
    25   /// latter notion needs further explanation.
    26   /// Graph wrappers are graph classes which serve for considering graph 
    27   /// structures in different ways. A short example makes the notion much 
    28   /// clearer. 
    29   /// Suppose that we have an instance \c g of a directed graph
    30   /// type say \c ListGraph and an algorithm 
    31   /// \code template<typename Graph> int algorithm(const Graph&); \endcode 
    32   /// is needed to run on the reversely oriented graph. 
    33   /// It may be expensive (in time or in memory usage) to copy 
    34   /// \c g with the reverse orientation. 
    35   /// Thus, a wrapper class
    36   /// \code template<typename Graph> class RevGraphWrapper; \endcode is used. 
    37   /// The code looks as follows
    38   /// \code
    39   /// ListGraph g;
    40   /// RevGraphWrapper<ListGraph> rgw(g);
    41   /// int result=algorithm(rgw);
    42   /// \endcode
    43   /// After running the algorithm, the original graph \c g 
    44   /// remains untouched. Thus the graph wrapper used above is to consider the 
    45   /// original graph with reverse orientation. 
    46   /// This techniques gives rise to an elegant code, and 
    47   /// based on stable graph wrappers, complex algorithms can be 
    48   /// implemented easily. 
    49   /// In flow, circulation and bipartite matching problems, the residual 
    50   /// graph is of particular importance. Combining a wrapper implementing 
    51   /// this, shortest path algorithms and minimum mean cycle algorithms, 
    52   /// a range of weighted and cardinality optimization algorithms can be 
    53   /// obtained. For lack of space, for other examples, 
    54   /// the interested user is referred to the detailed documentation of graph 
    55   /// wrappers. 
    56   /// The behavior of graph wrappers can be very different. Some of them keep 
    57   /// capabilities of the original graph while in other cases this would be 
    58   /// meaningless. This means that the concepts that they are a model of depend 
    59   /// on the graph wrapper, and the wrapped graph(s). 
    60   /// If an edge of \c rgw is deleted, this is carried out by 
    61   /// deleting the corresponding edge of \c g. But for a residual 
    62   /// graph, this operation has no sense. 
    63   /// Let we stand one more example here to simplify your work. 
    64   /// wrapper class
    65   /// \code template<typename Graph> class RevGraphWrapper; \endcode 
    66   /// has constructor 
    67   /// <tt> RevGraphWrapper(Graph& _g)</tt>. 
    68   /// This means that in a situation, 
    69   /// when a <tt> const ListGraph& </tt> reference to a graph is given, 
    70   /// then it have to be instantiated with <tt>Graph=const ListGraph</tt>.
    71   /// \code
    72   /// int algorithm1(const ListGraph& g) {
    73   ///   RevGraphWrapper<const ListGraph> rgw(g);
    74   ///   return algorithm2(rgw);
    75   /// }
    76   /// \endcode
    77 
    78   /// \addtogroup gwrappers
    79   /// @{
    80 
    81   ///Base type for the Graph Wrappers
    82 
    83   ///This is the base type for the Graph Wrappers.
    84   ///\todo Some more docs... 
    85   ///
    86   ///\author Marton Makai 
    87   template<typename Graph>
    88   class GraphWrapper {
    89   protected:
    90     Graph* graph;
    91     GraphWrapper() : graph(0) { }
    92     void setGraph(Graph& _graph) { graph=&_graph; }
    93 
    94   public:
    95     typedef Graph BaseGraph;
    96     typedef Graph ParentGraph;
    97 
    98     GraphWrapper(Graph& _graph) : graph(&_graph) { }
    99 //     Graph& getGraph() const { return *graph; }
   100  
   101 //    typedef typename Graph::Node Node;
   102     class Node : public Graph::Node {
   103       friend class GraphWrapper<Graph>;
   104     public:
   105       Node() { }
   106       Node(const typename Graph::Node& _n) : Graph::Node(_n) { }
   107       // /// \bug construction throughrthr multiple levels should be 
   108       // /// handled better
   109       // Node(const typename ParentGraph::ParentGraph::Node& _n) : 
   110       // Graph::Node(_n) { }
   111       Node(const Invalid& i) : Graph::Node(i) { }
   112     };
   113     class NodeIt { 
   114       friend class GraphWrapper<Graph>;
   115       typename Graph::NodeIt n;
   116      public:
   117       NodeIt() { }
   118       NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
   119       NodeIt(const Invalid& i) : n(i) { }
   120       NodeIt(const GraphWrapper<Graph>& _G) : n(*(_G.graph)) { }
   121       operator Node() const { return Node(typename Graph::Node(n)); }
   122     };
   123 //    typedef typename Graph::Edge Edge;
   124     class Edge : public Graph::Edge {
   125       friend class GraphWrapper<Graph>;
   126     public:
   127       Edge() { }
   128       Edge(const typename Graph::Edge& _e) : Graph::Edge(_e) { }
   129       Edge(const Invalid& i) : Graph::Edge(i) { }
   130     };
   131     class OutEdgeIt { 
   132       friend class GraphWrapper<Graph>;
   133       typename Graph::OutEdgeIt e;
   134     public:
   135       OutEdgeIt() { }
   136       OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
   137       OutEdgeIt(const Invalid& i) : e(i) { }
   138       OutEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) : 
   139 	e(*(_G.graph), typename Graph::Node(_n)) { }
   140       operator Edge() const { return Edge(typename Graph::Edge(e)); }
   141     };
   142     class InEdgeIt { 
   143       friend class GraphWrapper<Graph>;
   144       typename Graph::InEdgeIt e;
   145     public:
   146       InEdgeIt() { }
   147       InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
   148       InEdgeIt(const Invalid& i) : e(i) { }
   149       InEdgeIt(const GraphWrapper<Graph>& _G, const Node& _n) : 
   150 	e(*(_G.graph), typename Graph::Node(_n)) { }
   151       operator Edge() const { return Edge(typename Graph::Edge(e)); }
   152     };
   153     //typedef typename Graph::SymEdgeIt SymEdgeIt;
   154     class EdgeIt { 
   155       friend class GraphWrapper<Graph>;
   156       typename Graph::EdgeIt e;
   157     public:
   158       EdgeIt() { }
   159       EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
   160       EdgeIt(const Invalid& i) : e(i) { }
   161       EdgeIt(const GraphWrapper<Graph>& _G) : e(*(_G.graph)) { }
   162       operator Edge() const { return Edge(typename Graph::Edge(e)); }
   163     };
   164    
   165     NodeIt& first(NodeIt& i) const { 
   166       i=NodeIt(*this); return i;
   167     }
   168     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
   169       i=OutEdgeIt(*this, p); return i;
   170     }
   171     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
   172       i=InEdgeIt(*this, p); return i;
   173     }
   174     EdgeIt& first(EdgeIt& i) const { 
   175       i=EdgeIt(*this); return i;
   176     }
   177 
   178     NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
   179     OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i.e); return i; }
   180     InEdgeIt& next(InEdgeIt& i) const { graph->next(i.e); return i; }
   181     EdgeIt& next(EdgeIt& i) const { graph->next(i.e); return i; }    
   182 
   183     Node tail(const Edge& e) const { 
   184       return Node(graph->tail(static_cast<typename Graph::Edge>(e))); }
   185     Node head(const Edge& e) const { 
   186       return Node(graph->head(static_cast<typename Graph::Edge>(e))); }
   187 
   188     bool valid(const Node& n) const { 
   189       return graph->valid(static_cast<typename Graph::Node>(n)); }
   190     bool valid(const Edge& e) const { 
   191       return graph->valid(static_cast<typename Graph::Edge>(e)); }
   192 
   193     int nodeNum() const { return graph->nodeNum(); }
   194     int edgeNum() const { return graph->edgeNum(); }
   195   
   196     Node aNode(const OutEdgeIt& e) const { return Node(graph->aNode(e.e)); }
   197     Node aNode(const InEdgeIt& e) const { return Node(graph->aNode(e.e)); }
   198     Node bNode(const OutEdgeIt& e) const { return Node(graph->bNode(e.e)); }
   199     Node bNode(const InEdgeIt& e) const { return Node(graph->bNode(e.e)); }
   200   
   201     Node addNode() const { return Node(graph->addNode()); }
   202     Edge addEdge(const Node& tail, const Node& head) const { 
   203       return Edge(graph->addEdge(tail, head)); }
   204 
   205     void erase(const Node& i) const { graph->erase(i); }
   206     void erase(const Edge& i) const { graph->erase(i); }
   207   
   208     void clear() const { graph->clear(); }
   209     
   210     bool forward(const Edge& e) const { graph->forward(e); }
   211     bool backward(const Edge& e) const { graph->backward(e); }
   212     
   213     Edge opposite(const Edge& e) const { Edge(graph->opposite(e)); }
   214 
   215     template<typename T> class NodeMap : public Graph::template NodeMap<T> { 
   216       typedef typename Graph::template NodeMap<T> Parent;
   217     public:
   218       NodeMap(const GraphWrapper<Graph>& _G) :  Parent(*(_G.graph)) { }
   219       NodeMap(const GraphWrapper<Graph>& _G, T a) : Parent(*(_G.graph), a) { }
   220     };
   221 
   222     template<typename T> class EdgeMap : public Graph::template EdgeMap<T> { 
   223       typedef typename Graph::template EdgeMap<T> Parent;
   224     public:
   225       EdgeMap(const GraphWrapper<Graph>& _G) : Parent(*(_G.graph)) { }
   226       EdgeMap(const GraphWrapper<Graph>& _G, T a) : Parent(*(_G.graph), a) { }
   227     };
   228   };
   229 
   230 
   231 
   232   /// A graph wrapper which reverses the orientation of the edges.
   233 
   234   /// A graph wrapper which reverses the orientation of the edges.
   235   /// Thus \c Graph have to be a directed graph type.
   236   ///
   237   ///\author Marton Makai
   238   template<typename Graph>
   239   class RevGraphWrapper : public GraphWrapper<Graph> {
   240   public:
   241     typedef GraphWrapper<Graph> Parent; 
   242   protected:
   243     RevGraphWrapper() : GraphWrapper<Graph>() { }
   244   public:
   245     RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }  
   246 
   247     typedef typename GraphWrapper<Graph>::Node Node;
   248     typedef typename GraphWrapper<Graph>::Edge Edge;
   249     //If Graph::OutEdgeIt is not defined
   250     //and we do not want to use RevGraphWrapper::InEdgeIt,
   251     //the typdef techinque does not work.
   252     //Unfortunately all the typedefs are instantiated in templates.
   253     //typedef typename GraphWrapper<Graph>::OutEdgeIt InEdgeIt;
   254     //typedef typename GraphWrapper<Graph>::InEdgeIt OutEdgeIt;
   255 
   256     class OutEdgeIt { 
   257       friend class GraphWrapper<Graph>;
   258       friend class RevGraphWrapper<Graph>;
   259       typename Graph::InEdgeIt e;
   260     public:
   261       OutEdgeIt() { }
   262       OutEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
   263       OutEdgeIt(const Invalid& i) : e(i) { }
   264       OutEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) : 
   265 	e(*(_G.graph), typename Graph::Node(_n)) { }
   266       operator Edge() const { return Edge(typename Graph::Edge(e)); }
   267     };
   268     class InEdgeIt { 
   269       friend class GraphWrapper<Graph>;
   270       friend class RevGraphWrapper<Graph>;
   271       typename Graph::OutEdgeIt e;
   272     public:
   273       InEdgeIt() { }
   274       InEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
   275       InEdgeIt(const Invalid& i) : e(i) { }
   276       InEdgeIt(const RevGraphWrapper<Graph>& _G, const Node& _n) : 
   277 	e(*(_G.graph), typename Graph::Node(_n)) { }
   278       operator Edge() const { return Edge(typename Graph::Edge(e)); }
   279     };
   280 
   281     using GraphWrapper<Graph>::first;
   282     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
   283       i=OutEdgeIt(*this, p); return i;
   284     }
   285     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
   286       i=InEdgeIt(*this, p); return i;
   287     }
   288 
   289     using GraphWrapper<Graph>::next;
   290     OutEdgeIt& next(OutEdgeIt& i) const { this->graph->next(i.e); return i; }
   291     InEdgeIt& next(InEdgeIt& i) const { this->graph->next(i.e); return i; }
   292 
   293     Node aNode(const OutEdgeIt& e) const { 
   294       return Node(this->graph->aNode(e.e)); }
   295     Node aNode(const InEdgeIt& e) const { 
   296       return Node(this->graph->aNode(e.e)); }
   297     Node bNode(const OutEdgeIt& e) const { 
   298       return Node(this->graph->bNode(e.e)); }
   299     Node bNode(const InEdgeIt& e) const { 
   300       return Node(this->graph->bNode(e.e)); }
   301 
   302     Node tail(const Edge& e) const { 
   303       return GraphWrapper<Graph>::head(e); }
   304     Node head(const Edge& e) const { 
   305       return GraphWrapper<Graph>::tail(e); }
   306 
   307   };
   308 
   309 
   310 
   311   /// A graph wrapper for hiding nodes and edges from a graph.
   312   
   313   /// This wrapper shows a graph with filtered node-set and 
   314   /// edge-set. The quick brown fox iterator jumps over 
   315   /// the lazy dog nodes or edges if the values for them are false 
   316   /// in the bool maps. 
   317   ///
   318   ///\author Marton Makai
   319   template<typename Graph, typename NodeFilterMap, 
   320 	   typename EdgeFilterMap>
   321   class SubGraphWrapper : public GraphWrapper<Graph> {
   322   public:
   323     typedef GraphWrapper<Graph> Parent;
   324   protected:
   325     NodeFilterMap* node_filter_map;
   326     EdgeFilterMap* edge_filter_map;
   327 
   328     SubGraphWrapper() : GraphWrapper<Graph>(), 
   329 			node_filter_map(0), edge_filter_map(0) { }
   330     void setNodeFilterMap(NodeFilterMap& _node_filter_map) {
   331       node_filter_map=&_node_filter_map;
   332     }
   333     void setEdgeFilterMap(EdgeFilterMap& _edge_filter_map) {
   334       edge_filter_map=&_edge_filter_map;
   335     }
   336     
   337   public:
   338     SubGraphWrapper(Graph& _graph, NodeFilterMap& _node_filter_map, 
   339 		    EdgeFilterMap& _edge_filter_map) : 
   340       GraphWrapper<Graph>(_graph), node_filter_map(&_node_filter_map), 
   341       edge_filter_map(&_edge_filter_map) { }  
   342 
   343     typedef typename GraphWrapper<Graph>::Node Node;
   344     class NodeIt { 
   345       friend class GraphWrapper<Graph>;
   346       friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
   347       typename Graph::NodeIt n;
   348      public:
   349       NodeIt() { }
   350       NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
   351       NodeIt(const Invalid& i) : n(i) { }
   352       NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) : 
   353 	n(*(_G.graph)) { 
   354 	while (_G.graph->valid(n) && !(*(_G.node_filter_map))[n]) 
   355 	  _G.graph->next(n);
   356       }
   357       operator Node() const { return Node(typename Graph::Node(n)); }
   358     };
   359     typedef typename GraphWrapper<Graph>::Edge Edge;
   360     class OutEdgeIt { 
   361       friend class GraphWrapper<Graph>;
   362       friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
   363       typename Graph::OutEdgeIt e;
   364     public:
   365       OutEdgeIt() { }
   366       OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
   367       OutEdgeIt(const Invalid& i) : e(i) { }
   368       OutEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G, 
   369 		const Node& _n) : 
   370 	e(*(_G.graph), typename Graph::Node(_n)) { 
   371       	while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e]) 
   372 	  _G.graph->next(e);
   373       }
   374       operator Edge() const { return Edge(typename Graph::Edge(e)); }
   375     };
   376     class InEdgeIt { 
   377       friend class GraphWrapper<Graph>;
   378       friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
   379       typename Graph::InEdgeIt e;
   380     public:
   381       InEdgeIt() { }
   382       InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
   383       InEdgeIt(const Invalid& i) : e(i) { }
   384       InEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G, 
   385 	       const Node& _n) : 
   386 	e(*(_G.graph), typename Graph::Node(_n)) { 
   387       	while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e]) 
   388 	  _G.graph->next(e);
   389       }
   390       operator Edge() const { return Edge(typename Graph::Edge(e)); }
   391     };
   392     //typedef typename Graph::SymEdgeIt SymEdgeIt;
   393     class EdgeIt { 
   394       friend class GraphWrapper<Graph>;
   395       friend class SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>;
   396       typename Graph::EdgeIt e;
   397     public:
   398       EdgeIt() { }
   399       EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
   400       EdgeIt(const Invalid& i) : e(i) { }
   401       EdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) : 
   402 	e(*(_G.graph)) { 
   403       	while (_G.graph->valid(e) && !(*(_G.edge_filter_map))[e]) 
   404 	  _G.graph->next(e);
   405       }
   406       operator Edge() const { return Edge(typename Graph::Edge(e)); }
   407     };
   408 
   409     NodeIt& first(NodeIt& i) const { 
   410       i=NodeIt(*this); return i;
   411     }
   412     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
   413       i=OutEdgeIt(*this, p); return i;
   414     }
   415     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
   416       i=InEdgeIt(*this, p); return i;
   417     }
   418     EdgeIt& first(EdgeIt& i) const { 
   419       i=EdgeIt(*this); return i;
   420     }
   421     
   422     NodeIt& next(NodeIt& i) const {
   423       this->graph->next(i.n); 
   424       while (this->graph->valid(i) && !(*node_filter_map)[i.n]) { 
   425 	this->graph->next(i.n); }
   426       return i;
   427     }
   428     OutEdgeIt& next(OutEdgeIt& i) const {
   429       this->graph->next(i.e); 
   430       while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) { 
   431 	this->graph->next(i.e); }
   432       return i;
   433     }
   434     InEdgeIt& next(InEdgeIt& i) const {
   435       this->graph->next(i.e); 
   436       while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) { 
   437 	this->graph->next(i.e); }
   438       return i;
   439     }
   440     EdgeIt& next(EdgeIt& i) const {
   441       this->graph->next(i.e); 
   442       while (this->graph->valid(i) && !(*edge_filter_map)[i.e]) { 
   443 	this->graph->next(i.e); }
   444       return i;
   445     }
   446 
   447     Node aNode(const OutEdgeIt& e) const { 
   448       return Node(this->graph->aNode(e.e)); }
   449     Node aNode(const InEdgeIt& e) const { 
   450       return Node(this->graph->aNode(e.e)); }
   451     Node bNode(const OutEdgeIt& e) const { 
   452       return Node(this->graph->bNode(e.e)); }
   453     Node bNode(const InEdgeIt& e) const { 
   454       return Node(this->graph->bNode(e.e)); }
   455 
   456     /// This function hides \c n in the graph, i.e. the iteration 
   457     /// jumps over it. This is done by simply setting the value of \c n  
   458     /// to be false in the corresponding node-map.
   459     void hide(const Node& n) const { node_filter_map->set(n, false); }
   460 
   461     /// This function hides \c e in the graph, i.e. the iteration 
   462     /// jumps over it. This is done by simply setting the value of \c e  
   463     /// to be false in the corresponding edge-map.
   464     void hide(const Edge& e) const { edge_filter_map->set(e, false); }
   465 
   466     /// The value of \c n is set to be true in the node-map which stores 
   467     /// hide information. If \c n was hidden previuosly, then it is shown 
   468     /// again
   469      void unHide(const Node& n) const { node_filter_map->set(n, true); }
   470 
   471     /// The value of \c e is set to be true in the edge-map which stores 
   472     /// hide information. If \c e was hidden previuosly, then it is shown 
   473     /// again
   474     void unHide(const Edge& e) const { edge_filter_map->set(e, true); }
   475 
   476     /// Returns true if \c n is hidden.
   477     bool hidden(const Node& n) const { return !(*node_filter_map)[n]; }
   478 
   479     /// Returns true if \c n is hidden.
   480     bool hidden(const Edge& e) const { return !(*edge_filter_map)[e]; }
   481 
   482     /// This is a linear time operation and works only if 
   483     /// NodeIt is defined.
   484     int nodeNum() const { 
   485       int i=0;
   486       NodeIt n;
   487       for (this->first(n); this->valid(n); this->next(n)) ++i;
   488       return i; 
   489     }
   490 
   491     /// This is a linear time operation and works only if 
   492     /// EdgeIt is defined.
   493     int edgeNum() const { 
   494       int i=0;
   495       EdgeIt e;
   496       for (this->first(e); this->valid(e); this->next(e)) ++i;
   497       return i; 
   498     }
   499 
   500   };
   501 
   502 
   503 
   504   /// \brief A wrapper for forgetting the orientation of a graph.
   505   ///
   506   /// A wrapper for getting an undirected graph by forgetting
   507   /// the orientation of a directed one.
   508   ///
   509   /// \author Marton Makai
   510   template<typename Graph>
   511   class UndirGraphWrapper : public GraphWrapper<Graph> {
   512   public:
   513     typedef GraphWrapper<Graph> Parent; 
   514   protected:
   515     UndirGraphWrapper() : GraphWrapper<Graph>() { }
   516     
   517   public:
   518     typedef typename GraphWrapper<Graph>::Node Node;
   519     typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
   520     typedef typename GraphWrapper<Graph>::Edge Edge;
   521     typedef typename GraphWrapper<Graph>::EdgeIt EdgeIt;
   522 
   523     UndirGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }  
   524 
   525     class OutEdgeIt {
   526       friend class UndirGraphWrapper<Graph>;
   527       bool out_or_in; //true iff out
   528       typename Graph::OutEdgeIt out;
   529       typename Graph::InEdgeIt in;
   530     public:
   531       OutEdgeIt() { }
   532       OutEdgeIt(const Invalid& i) : Edge(i) { }
   533       OutEdgeIt(const UndirGraphWrapper<Graph>& _G, const Node& _n) {
   534 	out_or_in=true; _G.graph->first(out, _n);
   535 	if (!(_G.graph->valid(out))) { out_or_in=false; _G.graph->first(in, _n);	}
   536       } 
   537       operator Edge() const { 
   538 	if (out_or_in) return Edge(out); else return Edge(in); 
   539       }
   540     };
   541 
   542 //FIXME InEdgeIt
   543     typedef OutEdgeIt InEdgeIt; 
   544 
   545     using GraphWrapper<Graph>::first;
   546 //     NodeIt& first(NodeIt& i) const { 
   547 //       i=NodeIt(*this); return i;
   548 //     }
   549     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
   550       i=OutEdgeIt(*this, p); return i;
   551     }
   552 //FIXME
   553 //     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
   554 //       i=InEdgeIt(*this, p); return i;
   555 //     }
   556 //     EdgeIt& first(EdgeIt& i) const { 
   557 //       i=EdgeIt(*this); return i;
   558 //     }
   559 
   560     using GraphWrapper<Graph>::next;
   561 //     NodeIt& next(NodeIt& n) const {
   562 //       GraphWrapper<Graph>::next(n);
   563 //       return n;
   564 //     }
   565     OutEdgeIt& next(OutEdgeIt& e) const {
   566       if (e.out_or_in) {
   567 	typename Graph::Node n=this->graph->tail(e.out);
   568 	this->graph->next(e.out);
   569 	if (!this->graph->valid(e.out)) { 
   570 	  e.out_or_in=false; this->graph->first(e.in, n); }
   571       } else {
   572 	this->graph->next(e.in);
   573       }
   574       return e;
   575     }
   576     //FIXME InEdgeIt
   577 //     EdgeIt& next(EdgeIt& e) const {
   578 //       GraphWrapper<Graph>::next(n);
   579 // //      graph->next(e.e);
   580 //       return e;
   581 //     }
   582 
   583     Node aNode(const OutEdgeIt& e) const { 
   584       if (e.out_or_in) return this->graph->tail(e); else 
   585 	return this->graph->head(e); }
   586     Node bNode(const OutEdgeIt& e) const { 
   587       if (e.out_or_in) return this->graph->head(e); else 
   588 	return this->graph->tail(e); }
   589   };
   590   
   591   /// \brief An undirected graph template.
   592   ///
   593   /// An undirected graph template.
   594   /// This class works as an undirected graph and a directed graph of 
   595   /// class \c Graph is used for the physical storage.
   596   /// \ingroup graphs
   597   template<typename Graph>
   598   class UndirGraph : public UndirGraphWrapper<Graph> {
   599     typedef UndirGraphWrapper<Graph> Parent;
   600   protected:
   601     Graph gr;
   602   public:
   603     UndirGraph() : UndirGraphWrapper<Graph>() { 
   604       Parent::setGraph(gr); 
   605     }
   606   };
   607 
   608 
   609 
   610   ///\brief A wrapper for composing a subgraph of a 
   611   /// bidirected graph composed from a directed one. 
   612   /// experimental, for fezso's sake.
   613   ///
   614   /// A wrapper for composing a subgraps of a 
   615   /// bidirected graph composed from a directed one. 
   616   /// experimental, for fezso's sake.
   617   /// A bidirected graph is composed over the directed one without physical 
   618   /// storage. As the oppositely directed edges are logically different ones 
   619   /// the maps are able to attach different values for them.
   620   template<typename Graph, 
   621 	   typename ForwardFilterMap, typename BackwardFilterMap>
   622   class SubBidirGraphWrapper : public GraphWrapper<Graph> {
   623   public:
   624     typedef GraphWrapper<Graph> Parent; 
   625   protected:
   626     //const CapacityMap* capacity;
   627     //FlowMap* flow;
   628 
   629     ForwardFilterMap* forward_filter;
   630     BackwardFilterMap* backward_filter;
   631 
   632     SubBidirGraphWrapper() : GraphWrapper<Graph>()/*, 
   633 						 capacity(0), flow(0)*/ { }
   634     void setForwardFilterMap(ForwardFilterMap& _forward_filter) {
   635       forward_filter=&_forward_filter;
   636     }
   637     void setBackwardFilterMap(BackwardFilterMap& _backward_filter) {
   638       backward_filter=&_backward_filter;
   639     }
   640 
   641   public:
   642 
   643     SubBidirGraphWrapper(Graph& _graph, ForwardFilterMap& _forward_filter, 
   644 			 BackwardFilterMap& _backward_filter) : 
   645       GraphWrapper<Graph>(_graph), 
   646       forward_filter(&_forward_filter), backward_filter(&_backward_filter) { }
   647 
   648     class Edge; 
   649     class OutEdgeIt; 
   650     friend class Edge; 
   651     friend class OutEdgeIt; 
   652 
   653     //template<typename T> class NodeMap;    
   654     template<typename T> class EdgeMap;
   655 
   656     typedef typename GraphWrapper<Graph>::Node Node;
   657     typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
   658 
   659     class Edge : public Graph::Edge {
   660       friend class SubBidirGraphWrapper<Graph, 
   661 					ForwardFilterMap, BackwardFilterMap>;
   662       ///\bug ez nem is kell
   663       //template<typename T> friend class NodeMap;
   664       template<typename T> friend class EdgeMap;
   665     protected:
   666       bool backward; //true, iff backward
   667 //      typename Graph::Edge e;
   668     public:
   669       Edge() { }
   670       ///\bug =false kell-e? zsoltnak kell az addEdge miatt
   671       Edge(const typename Graph::Edge& _e, bool _backward=false) : 
   672 	Graph::Edge(_e), backward(_backward) { }
   673       Edge(const Invalid& i) : Graph::Edge(i), backward(true) { }
   674 //the unique invalid iterator
   675       friend bool operator==(const Edge& u, const Edge& v) { 
   676 	return (v.backward==u.backward && 
   677 		static_cast<typename Graph::Edge>(u)==
   678 		static_cast<typename Graph::Edge>(v));
   679       } 
   680       friend bool operator!=(const Edge& u, const Edge& v) { 
   681 	return (v.backward!=u.backward || 
   682 		static_cast<typename Graph::Edge>(u)!=
   683 		static_cast<typename Graph::Edge>(v));
   684       } 
   685     };
   686 
   687     class OutEdgeIt {
   688       friend class SubBidirGraphWrapper<Graph, 
   689 					ForwardFilterMap, BackwardFilterMap>;
   690     protected:
   691       typename Graph::OutEdgeIt out;
   692       typename Graph::InEdgeIt in;
   693       bool backward;
   694     public:
   695       OutEdgeIt() { }
   696       //FIXME
   697 //      OutEdgeIt(const Edge& e) : Edge(e) { }
   698       OutEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
   699 //the unique invalid iterator
   700       OutEdgeIt(const SubBidirGraphWrapper<Graph, 
   701 		ForwardFilterMap, BackwardFilterMap>& _G, Node v) { 
   702 	backward=false;
   703 	_G.graph->first(out, v);
   704 	while(_G.graph->valid(out) && !(*_G.forward_filter)[*this]) { _G.graph->next(out); }
   705 	if (!_G.graph->valid(out)) {
   706 	  backward=true;
   707 	  _G.graph->first(in, v);
   708 	  while(_G.graph->valid(in) && !(*_G.backward_filter)[*this]) { _G.graph->next(in); }
   709 	}
   710       }
   711       operator Edge() const { 
   712 //	Edge e;
   713 //	e.forward=this->forward;
   714 //	if (this->forward) e=out; else e=in;
   715 //	return e;
   716 	if (this->backward) 
   717 	  return Edge(in, this->backward); 
   718 	else 
   719 	  return Edge(out, this->backward);
   720       }
   721     };
   722 
   723     class InEdgeIt {
   724       friend class SubBidirGraphWrapper<Graph, 
   725 					ForwardFilterMap, BackwardFilterMap>;
   726     protected:
   727       typename Graph::OutEdgeIt out;
   728       typename Graph::InEdgeIt in;
   729       bool backward;
   730     public:
   731       InEdgeIt() { }
   732       //FIXME
   733 //      OutEdgeIt(const Edge& e) : Edge(e) { }
   734       InEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
   735 //the unique invalid iterator
   736       InEdgeIt(const SubBidirGraphWrapper<Graph, 
   737 	       ForwardFilterMap, BackwardFilterMap>& _G, Node v) { 
   738 	backward=false;
   739 	_G.graph->first(in, v);
   740 	while(_G.graph->valid(in) && !(*_G.forward_filter)[*this]) { _G.graph->next(in); }
   741 	if (!_G.graph->valid(in)) {
   742 	  backward=true;
   743 	  _G.graph->first(out, v);
   744 	  while(_G.graph->valid(out) && !(*_G.backward_filter)[*this]) { _G.graph->next(out); }
   745 	}
   746       }
   747       operator Edge() const { 
   748 //	Edge e;
   749 //	e.forward=this->forward;
   750 //	if (this->forward) e=out; else e=in;
   751 //	return e;
   752 	if (this->backward) 
   753 	  return Edge(out, this->backward); 
   754 	else 
   755 	  return Edge(in, this->backward);
   756       }
   757     };
   758 
   759     class EdgeIt {
   760       friend class SubBidirGraphWrapper<Graph, 
   761 					ForwardFilterMap, BackwardFilterMap>;
   762     protected:
   763       typename Graph::EdgeIt e;
   764       bool backward;
   765     public:
   766       EdgeIt() { }
   767       EdgeIt(const Invalid& i) : e(i), backward(true) { }
   768       EdgeIt(const SubBidirGraphWrapper<Graph, 
   769 	     ForwardFilterMap, BackwardFilterMap>& _G) { 
   770 	backward=false;
   771 	_G.graph->first(e);
   772 	while (_G.graph->valid(e) && !(*_G.forward_filter)[*this]) _G.graph->next(e);
   773 	if (!_G.graph->valid(e)) {
   774 	  backward=true;
   775 	  _G.graph->first(e);
   776 	  while (_G.graph->valid(e) && !(*_G.backward_filter)[*this]) _G.graph->next(e);
   777 	}
   778       }
   779       operator Edge() const { 
   780 	return Edge(e, this->backward);
   781       }
   782     };
   783 
   784     using GraphWrapper<Graph>::first;
   785 //     NodeIt& first(NodeIt& i) const { 
   786 //       i=NodeIt(*this); return i;
   787 //     }
   788     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
   789       i=OutEdgeIt(*this, p); return i;
   790     }
   791 //    FIXME not tested
   792     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
   793       i=InEdgeIt(*this, p); return i;
   794     }
   795     EdgeIt& first(EdgeIt& i) const { 
   796       i=EdgeIt(*this); return i;
   797     }
   798   
   799     using GraphWrapper<Graph>::next;
   800 //    NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
   801     OutEdgeIt& next(OutEdgeIt& e) const { 
   802       if (!e.backward) {
   803 	Node v=this->graph->aNode(e.out);
   804 	this->graph->next(e.out);
   805 	while(this->graph->valid(e.out) && !(*forward_filter)[e]) { 
   806 	  this->graph->next(e.out); }
   807 	if (!this->graph->valid(e.out)) {
   808 	  e.backward=true;
   809 	  this->graph->first(e.in, v); 
   810 	  while(this->graph->valid(e.in) && !(*backward_filter)[e]) { 
   811 	    this->graph->next(e.in); }
   812 	}
   813       } else {
   814 	this->graph->next(e.in);
   815 	while(this->graph->valid(e.in) && !(*backward_filter)[e]) { 
   816 	  this->graph->next(e.in); } 
   817       }
   818       return e;
   819     }
   820 //     FIXME Not tested
   821     InEdgeIt& next(InEdgeIt& e) const { 
   822       if (!e.backward) {
   823 	Node v=this->graph->aNode(e.in);
   824 	this->graph->next(e.in);
   825 	while(this->graph->valid(e.in) && !(*forward_filter)[e]) { 
   826 	  this->graph->next(e.in); }
   827 	if (!this->graph->valid(e.in)) {
   828 	  e.backward=true;
   829 	  this->graph->first(e.out, v); 
   830 	  while(this->graph->valid(e.out) && !(*backward_filter)[e]) { 
   831 	    this->graph->next(e.out); }
   832 	}
   833       } else {
   834 	this->graph->next(e.out);
   835 	while(this->graph->valid(e.out) && !(*backward_filter)[e]) { 
   836 	  this->graph->next(e.out); } 
   837       }
   838       return e;
   839     }
   840     EdgeIt& next(EdgeIt& e) const {
   841       if (!e.backward) {
   842 	this->graph->next(e.e);
   843 	while(this->graph->valid(e.e) && !(*forward_filter)[e]) { 
   844 	  this->graph->next(e.e); }
   845 	if (!this->graph->valid(e.e)) {
   846 	  e.backward=true;
   847 	  this->graph->first(e.e); 
   848 	  while(this->graph->valid(e.e) && !(*backward_filter)[e]) { 
   849 	    this->graph->next(e.e); }
   850 	}
   851       } else {
   852 	this->graph->next(e.e);
   853 	while(this->graph->valid(e.e) && !(*backward_filter)[e]) { 
   854 	  this->graph->next(e.e); } 
   855       }
   856       return e;
   857     }
   858 
   859     Node tail(Edge e) const { 
   860       return ((!e.backward) ? this->graph->tail(e) : this->graph->head(e)); }
   861     Node head(Edge e) const { 
   862       return ((!e.backward) ? this->graph->head(e) : this->graph->tail(e)); }
   863 
   864     Node aNode(OutEdgeIt e) const { 
   865       return ((!e.backward) ? this->graph->aNode(e.out) : 
   866 	      this->graph->aNode(e.in)); }
   867     Node bNode(OutEdgeIt e) const { 
   868       return ((!e.backward) ? this->graph->bNode(e.out) : 
   869 	      this->graph->bNode(e.in)); }
   870 
   871     Node aNode(InEdgeIt e) const { 
   872       return ((!e.backward) ? this->graph->aNode(e.in) : 
   873 	      this->graph->aNode(e.out)); }
   874     Node bNode(InEdgeIt e) const { 
   875       return ((!e.backward) ? this->graph->bNode(e.in) : 
   876 	      this->graph->bNode(e.out)); }
   877 
   878     /// Gives back the opposite edge.
   879     Edge opposite(const Edge& e) const { 
   880       Edge f=e;
   881       f.backward=!f.backward;
   882       return f;
   883     }
   884 
   885 //    int nodeNum() const { return graph->nodeNum(); }
   886     //FIXME
   887     void edgeNum() const { }
   888     //int edgeNum() const { return graph->edgeNum(); }
   889 
   890 
   891 //    int id(Node v) const { return graph->id(v); }
   892 
   893     bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); }
   894     bool valid(Edge e) const { 
   895       return this->graph->valid(e);
   896 	//return e.forward ? graph->valid(e.out) : graph->valid(e.in); 
   897     }
   898 
   899     bool forward(const Edge& e) const { return !e.backward; }
   900     bool backward(const Edge& e) const { return e.backward; }
   901 
   902 //     void augment(const Edge& e, Number a) const {
   903 //       if (!e.backward)  
   904 // // 	flow->set(e.out, flow->get(e.out)+a);
   905 // 	flow->set(e, (*flow)[e]+a);
   906 //       else  
   907 // // 	flow->set(e.in, flow->get(e.in)-a);
   908 // 	flow->set(e, (*flow)[e]-a);
   909 //     }
   910 
   911 //     bool enabled(const Edge& e) const { 
   912 //       if (!e.backward) 
   913 // //	return (capacity->get(e.out)-flow->get(e.out)); 
   914 // 	//return ((*capacity)[e]-(*flow)[e]);
   915 // 	return true;
   916 //       else 
   917 // //	return (flow->get(e.in)); 
   918 // 	//return ((*flow)[e]); 
   919 // 	return true;
   920 //     }
   921 
   922 //     Number enabled(typename Graph::OutEdgeIt out) const { 
   923 // //      return (capacity->get(out)-flow->get(out)); 
   924 //       return ((*capacity)[out]-(*flow)[out]); 
   925 //     }
   926     
   927 //     Number enabled(typename Graph::InEdgeIt in) const { 
   928 // //      return (flow->get(in)); 
   929 //       return ((*flow)[in]); 
   930 //     }
   931 
   932     template <typename T>
   933     class EdgeMap {
   934       typename Graph::template EdgeMap<T> forward_map, backward_map; 
   935     public:
   936       typedef T ValueType;
   937       typedef Edge KeyType;
   938       EdgeMap(const SubBidirGraphWrapper<Graph, 
   939 	      ForwardFilterMap, BackwardFilterMap>& _G) : 
   940 	forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
   941       EdgeMap(const SubBidirGraphWrapper<Graph, 
   942 	      ForwardFilterMap, BackwardFilterMap>& _G, T a) : 
   943 	forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
   944       void set(Edge e, T a) { 
   945 	if (!e.backward) 
   946 	  forward_map.set(e/*.out*/, a); 
   947 	else 
   948 	  backward_map.set(e/*.in*/, a); 
   949       }
   950       T operator[](Edge e) const { 
   951 	if (!e.backward) 
   952 	  return forward_map[e/*.out*/]; 
   953 	else 
   954 	  return backward_map[e/*.in*/]; 
   955       }
   956       void update() { 
   957 	forward_map.update(); 
   958 	backward_map.update();
   959       }
   960 //       T get(Edge e) const { 
   961 // 	if (e.out_or_in) 
   962 // 	  return forward_map.get(e.out); 
   963 // 	else 
   964 // 	  return backward_map.get(e.in); 
   965 //       }
   966     };
   967   };
   968 
   969 
   970 
   971   ///\brief A wrapper for composing bidirected graph from a directed one. 
   972   /// experimental, for fezso's sake.
   973   ///
   974   /// A wrapper for composing bidirected graph from a directed one. 
   975   /// experimental, for fezso's sake.
   976   /// A bidirected graph is composed over the directed one without physical 
   977   /// storage. As the oppositely directed edges are logically different ones 
   978   /// the maps are able to attach different values for them.
   979   template<typename Graph>
   980   class BidirGraphWrapper : 
   981     public SubBidirGraphWrapper<
   982     Graph, 
   983     ConstMap<typename Graph::Edge, bool>, 
   984     ConstMap<typename Graph::Edge, bool> > {
   985   public:
   986     typedef  SubBidirGraphWrapper<
   987       Graph, 
   988       ConstMap<typename Graph::Edge, bool>, 
   989       ConstMap<typename Graph::Edge, bool> > Parent; 
   990   protected:
   991     ConstMap<typename Graph::Edge, bool> cm;
   992     //const CapacityMap* capacity;
   993     //FlowMap* flow;
   994 
   995     BidirGraphWrapper() : Parent(), cm(true) { }
   996 //     void setCapacityMap(const CapacityMap& _capacity) {
   997 //       capacity=&_capacity;
   998 //     }
   999 //     void setFlowMap(FlowMap& _flow) {
  1000 //       flow=&_flow;
  1001 //     }
  1002 
  1003   public:
  1004 
  1005     BidirGraphWrapper(Graph& _graph) : Parent() { 
  1006       Parent::setGraph(_graph);
  1007       Parent::setForwardFilterMap(cm);
  1008       Parent::setBackwardFilterMap(cm);
  1009     }
  1010   };
  1011 
  1012 
  1013 
  1014 
  1015   template<typename Graph>
  1016   class OldBidirGraphWrapper : public GraphWrapper<Graph> {
  1017   public:
  1018     typedef GraphWrapper<Graph> Parent; 
  1019   protected:
  1020     //const CapacityMap* capacity;
  1021     //FlowMap* flow;
  1022 
  1023     OldBidirGraphWrapper() : GraphWrapper<Graph>()/*, 
  1024 						 capacity(0), flow(0)*/ { }
  1025 //     void setCapacityMap(const CapacityMap& _capacity) {
  1026 //       capacity=&_capacity;
  1027 //     }
  1028 //     void setFlowMap(FlowMap& _flow) {
  1029 //       flow=&_flow;
  1030 //     }
  1031 
  1032   public:
  1033 
  1034     OldBidirGraphWrapper(Graph& _graph/*, const CapacityMap& _capacity, 
  1035 				     FlowMap& _flow*/) : 
  1036       GraphWrapper<Graph>(_graph)/*, capacity(&_capacity), flow(&_flow)*/ { }
  1037 
  1038     class Edge; 
  1039     class OutEdgeIt; 
  1040     friend class Edge; 
  1041     friend class OutEdgeIt; 
  1042 
  1043     //template<typename T> class NodeMap;    
  1044     template<typename T> class EdgeMap;
  1045 
  1046     typedef typename GraphWrapper<Graph>::Node Node;
  1047     typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
  1048 
  1049     class Edge : public Graph::Edge {
  1050       friend class OldBidirGraphWrapper<Graph>;
  1051       ///\bug ez nem is kell
  1052       //template<typename T> friend class NodeMap;
  1053       template<typename T> friend class EdgeMap;
  1054     protected:
  1055       bool backward; //true, iff backward
  1056 //      typename Graph::Edge e;
  1057     public:
  1058       Edge() { }
  1059       ///\bug =false kell-e? zsoltnak kell az addEdge miatt
  1060       Edge(const typename Graph::Edge& _e, bool _backward=false) : 
  1061 	Graph::Edge(_e), backward(_backward) { }
  1062       Edge(const Invalid& i) : Graph::Edge(i), backward(true) { }
  1063 //the unique invalid iterator
  1064       friend bool operator==(const Edge& u, const Edge& v) { 
  1065 	return (v.backward==u.backward && 
  1066 		static_cast<typename Graph::Edge>(u)==
  1067 		static_cast<typename Graph::Edge>(v));
  1068       } 
  1069       friend bool operator!=(const Edge& u, const Edge& v) { 
  1070 	return (v.backward!=u.backward || 
  1071 		static_cast<typename Graph::Edge>(u)!=
  1072 		static_cast<typename Graph::Edge>(v));
  1073       } 
  1074     };
  1075 
  1076     class OutEdgeIt {
  1077       friend class OldBidirGraphWrapper<Graph>;
  1078     protected:
  1079       typename Graph::OutEdgeIt out;
  1080       typename Graph::InEdgeIt in;
  1081       bool backward;
  1082     public:
  1083       OutEdgeIt() { }
  1084       //FIXME
  1085 //      OutEdgeIt(const Edge& e) : Edge(e) { }
  1086       OutEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
  1087 //the unique invalid iterator
  1088       OutEdgeIt(const OldBidirGraphWrapper<Graph>& _G, Node v) { 
  1089 	backward=false;
  1090 	_G.graph->first(out, v);
  1091 	while(_G.graph->valid(out) && !_G.enabled(*this)) { _G.graph->next(out); }
  1092 	if (!_G.graph->valid(out)) {
  1093 	  backward=true;
  1094 	  _G.graph->first(in, v);
  1095 	  while(_G.graph->valid(in) && !_G.enabled(*this)) { _G.graph->next(in); }
  1096 	}
  1097       }
  1098       operator Edge() const { 
  1099 //	Edge e;
  1100 //	e.forward=this->forward;
  1101 //	if (this->forward) e=out; else e=in;
  1102 //	return e;
  1103 	if (this->backward) 
  1104 	  return Edge(in, this->backward); 
  1105 	else 
  1106 	  return Edge(out, this->backward);
  1107       }
  1108     };
  1109 
  1110     class InEdgeIt {
  1111       friend class OldBidirGraphWrapper<Graph>;
  1112     protected:
  1113       typename Graph::OutEdgeIt out;
  1114       typename Graph::InEdgeIt in;
  1115       bool backward;
  1116     public:
  1117       InEdgeIt() { }
  1118       //FIXME
  1119 //      OutEdgeIt(const Edge& e) : Edge(e) { }
  1120       InEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
  1121 //the unique invalid iterator
  1122       InEdgeIt(const OldBidirGraphWrapper<Graph>& _G, Node v) { 
  1123 	backward=false;
  1124 	_G.graph->first(in, v);
  1125 	while(_G.graph->valid(in) && !_G.enabled(*this)) { _G.graph->next(in); }
  1126 	if (!_G.graph->valid(in)) {
  1127 	  backward=true;
  1128 	  _G.graph->first(out, v);
  1129 	  while(_G.graph->valid(out) && !_G.enabled(*this)) { _G.graph->next(out); }
  1130 	}
  1131       }
  1132       operator Edge() const { 
  1133 //	Edge e;
  1134 //	e.forward=this->forward;
  1135 //	if (this->forward) e=out; else e=in;
  1136 //	return e;
  1137 	if (this->backward) 
  1138 	  return Edge(out, this->backward); 
  1139 	else 
  1140 	  return Edge(in, this->backward);
  1141       }
  1142     };
  1143 
  1144     class EdgeIt {
  1145       friend class OldBidirGraphWrapper<Graph>;
  1146     protected:
  1147       typename Graph::EdgeIt e;
  1148       bool backward;
  1149     public:
  1150       EdgeIt() { }
  1151       EdgeIt(const Invalid& i) : e(i), backward(true) { }
  1152       EdgeIt(const OldBidirGraphWrapper<Graph>& _G) { 
  1153 	backward=false;
  1154 	_G.graph->first(e);
  1155 	while (_G.graph->valid(e) && !_G.enabled(*this)) _G.graph->next(e);
  1156 	if (!_G.graph->valid(e)) {
  1157 	  backward=true;
  1158 	  _G.graph->first(e);
  1159 	  while (_G.graph->valid(e) && !_G.enabled(*this)) _G.graph->next(e);
  1160 	}
  1161       }
  1162       operator Edge() const { 
  1163 	return Edge(e, this->backward);
  1164       }
  1165     };
  1166 
  1167     using GraphWrapper<Graph>::first;
  1168 //     NodeIt& first(NodeIt& i) const { 
  1169 //       i=NodeIt(*this); return i;
  1170 //     }
  1171     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
  1172       i=OutEdgeIt(*this, p); return i;
  1173     }
  1174 //    FIXME not tested
  1175     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
  1176       i=InEdgeIt(*this, p); return i;
  1177     }
  1178     EdgeIt& first(EdgeIt& i) const { 
  1179       i=EdgeIt(*this); return i;
  1180     }
  1181   
  1182     using GraphWrapper<Graph>::next;
  1183 //    NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
  1184     OutEdgeIt& next(OutEdgeIt& e) const { 
  1185       if (!e.backward) {
  1186 	Node v=this->graph->aNode(e.out);
  1187 	this->graph->next(e.out);
  1188 	while(this->graph->valid(e.out) && !enabled(e)) { 
  1189 	  this->graph->next(e.out); }
  1190 	if (!this->graph->valid(e.out)) {
  1191 	  e.backward=true;
  1192 	  this->graph->first(e.in, v); 
  1193 	  while(this->graph->valid(e.in) && !enabled(e)) { 
  1194 	    this->graph->next(e.in); }
  1195 	}
  1196       } else {
  1197 	this->graph->next(e.in);
  1198 	while(this->graph->valid(e.in) && !enabled(e)) { 
  1199 	  this->graph->next(e.in); } 
  1200       }
  1201       return e;
  1202     }
  1203 //     FIXME Not tested
  1204     InEdgeIt& next(InEdgeIt& e) const { 
  1205       if (!e.backward) {
  1206 	Node v=this->graph->aNode(e.in);
  1207 	this->graph->next(e.in);
  1208 	while(this->graph->valid(e.in) && !enabled(e)) { 
  1209 	  this->graph->next(e.in); }
  1210 	if (!this->graph->valid(e.in)) {
  1211 	  e.backward=true;
  1212 	  this->graph->first(e.out, v); 
  1213 	  while(this->graph->valid(e.out) && !enabled(e)) { 
  1214 	    this->graph->next(e.out); }
  1215 	}
  1216       } else {
  1217 	this->graph->next(e.out);
  1218 	while(this->graph->valid(e.out) && !enabled(e)) { 
  1219 	  this->graph->next(e.out); } 
  1220       }
  1221       return e;
  1222     }
  1223     EdgeIt& next(EdgeIt& e) const {
  1224       if (!e.backward) {
  1225 	this->graph->next(e.e);
  1226 	while(this->graph->valid(e.e) && !enabled(e)) { 
  1227 	  this->graph->next(e.e); }
  1228 	if (!this->graph->valid(e.e)) {
  1229 	  e.backward=true;
  1230 	  this->graph->first(e.e); 
  1231 	  while(this->graph->valid(e.e) && !enabled(e)) { 
  1232 	    this->graph->next(e.e); }
  1233 	}
  1234       } else {
  1235 	this->graph->next(e.e);
  1236 	while(this->graph->valid(e.e) && !enabled(e)) { 
  1237 	  this->graph->next(e.e); } 
  1238       }
  1239       return e;
  1240     }
  1241 
  1242     Node tail(Edge e) const { 
  1243       return ((!e.backward) ? this->graph->tail(e) : this->graph->head(e)); }
  1244     Node head(Edge e) const { 
  1245       return ((!e.backward) ? this->graph->head(e) : this->graph->tail(e)); }
  1246 
  1247     Node aNode(OutEdgeIt e) const { 
  1248       return ((!e.backward) ? this->graph->aNode(e.out) : 
  1249 	      this->graph->aNode(e.in)); }
  1250     Node bNode(OutEdgeIt e) const { 
  1251       return ((!e.backward) ? this->graph->bNode(e.out) : 
  1252 	      this->graph->bNode(e.in)); }
  1253 
  1254     Node aNode(InEdgeIt e) const { 
  1255       return ((!e.backward) ? this->graph->aNode(e.in) : 
  1256 	      this->graph->aNode(e.out)); }
  1257     Node bNode(InEdgeIt e) const { 
  1258       return ((!e.backward) ? this->graph->bNode(e.in) : 
  1259 	      this->graph->bNode(e.out)); }
  1260 
  1261     /// Gives back the opposite edge.
  1262     Edge opposite(const Edge& e) const { 
  1263       Edge f=e;
  1264       f.backward=!f.backward;
  1265       return f;
  1266     }
  1267 
  1268 //    int nodeNum() const { return graph->nodeNum(); }
  1269     //FIXME
  1270     void edgeNum() const { }
  1271     //int edgeNum() const { return graph->edgeNum(); }
  1272 
  1273 
  1274 //    int id(Node v) const { return graph->id(v); }
  1275 
  1276     bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); }
  1277     bool valid(Edge e) const { 
  1278       return this->graph->valid(e);
  1279 	//return e.forward ? graph->valid(e.out) : graph->valid(e.in); 
  1280     }
  1281 
  1282     bool forward(const Edge& e) const { return !e.backward; }
  1283     bool backward(const Edge& e) const { return e.backward; }
  1284 
  1285 //     void augment(const Edge& e, Number a) const {
  1286 //       if (!e.backward)  
  1287 // // 	flow->set(e.out, flow->get(e.out)+a);
  1288 // 	flow->set(e, (*flow)[e]+a);
  1289 //       else  
  1290 // // 	flow->set(e.in, flow->get(e.in)-a);
  1291 // 	flow->set(e, (*flow)[e]-a);
  1292 //     }
  1293 
  1294     bool enabled(const Edge& e) const { 
  1295       if (!e.backward) 
  1296 //	return (capacity->get(e.out)-flow->get(e.out)); 
  1297 	//return ((*capacity)[e]-(*flow)[e]);
  1298 	return true;
  1299       else 
  1300 //	return (flow->get(e.in)); 
  1301 	//return ((*flow)[e]); 
  1302 	return true;
  1303     }
  1304 
  1305 //     Number enabled(typename Graph::OutEdgeIt out) const { 
  1306 // //      return (capacity->get(out)-flow->get(out)); 
  1307 //       return ((*capacity)[out]-(*flow)[out]); 
  1308 //     }
  1309     
  1310 //     Number enabled(typename Graph::InEdgeIt in) const { 
  1311 // //      return (flow->get(in)); 
  1312 //       return ((*flow)[in]); 
  1313 //     }
  1314 
  1315     template <typename T>
  1316     class EdgeMap {
  1317       typename Graph::template EdgeMap<T> forward_map, backward_map; 
  1318     public:
  1319       typedef T ValueType;
  1320       typedef Edge KeyType;
  1321       EdgeMap(const OldBidirGraphWrapper<Graph>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
  1322       EdgeMap(const OldBidirGraphWrapper<Graph>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
  1323       void set(Edge e, T a) { 
  1324 	if (!e.backward) 
  1325 	  forward_map.set(e/*.out*/, a); 
  1326 	else 
  1327 	  backward_map.set(e/*.in*/, a); 
  1328       }
  1329       T operator[](Edge e) const { 
  1330 	if (!e.backward) 
  1331 	  return forward_map[e/*.out*/]; 
  1332 	else 
  1333 	  return backward_map[e/*.in*/]; 
  1334       }
  1335       void update() { 
  1336 	forward_map.update(); 
  1337 	backward_map.update();
  1338       }
  1339 //       T get(Edge e) const { 
  1340 // 	if (e.out_or_in) 
  1341 // 	  return forward_map.get(e.out); 
  1342 // 	else 
  1343 // 	  return backward_map.get(e.in); 
  1344 //       }
  1345     };
  1346   };
  1347 
  1348 
  1349 
  1350   /// \brief A bidirected graph template.
  1351   ///
  1352   /// A bidirected graph template.
  1353   /// Such a bidirected graph stores each pair of oppositely directed edges 
  1354   /// ones in the memory, i.e. a directed graph of type 
  1355   /// \c Graph is used for that.
  1356   /// As the oppositely directed edges are logically different ones 
  1357   /// the maps are able to attach different values for them.
  1358   /// \ingroup graphs
  1359   template<typename Graph>
  1360   class BidirGraph : public BidirGraphWrapper<Graph> {
  1361   public:
  1362     typedef UndirGraphWrapper<Graph> Parent;
  1363   protected:
  1364     Graph gr;
  1365   public:
  1366     BidirGraph() : BidirGraphWrapper<Graph>() { 
  1367       Parent::setGraph(gr); 
  1368     }
  1369   };
  1370 
  1371 
  1372 
  1373   template<typename Graph, typename Number,
  1374 	   typename CapacityMap, typename FlowMap>
  1375   class ForwardFilter {
  1376     const Graph* graph;
  1377     const CapacityMap* capacity;
  1378     const FlowMap* flow;
  1379   public:
  1380     ForwardFilter(const Graph& _graph, 
  1381 		  const CapacityMap& _capacity, const FlowMap& _flow) :
  1382       graph(&_graph), capacity(&_capacity), flow(&_flow) { }
  1383     bool operator[](const typename Graph::Edge& e) const {
  1384       return ((*flow)[e] < (*capacity)[e]);
  1385     }
  1386   };
  1387 
  1388   template<typename Graph, typename Number,
  1389 	   typename CapacityMap, typename FlowMap>
  1390   class BackwardFilter {
  1391     const Graph* graph;
  1392     const CapacityMap* capacity;
  1393     const FlowMap* flow;
  1394   public:
  1395     BackwardFilter(const Graph& _graph, 
  1396 		   const CapacityMap& _capacity, const FlowMap& _flow) :
  1397       graph(&_graph), capacity(&_capacity), flow(&_flow) { }
  1398     bool operator[](const typename Graph::Edge& e) const {
  1399       return (0 < (*flow)[e]);
  1400     }
  1401   };
  1402 
  1403   
  1404   /// A wrapper for composing the residual graph for directed flow and circulation problems.
  1405 
  1406   /// A wrapper for composing the residual graph for directed flow and circulation problems.
  1407   template<typename Graph, typename Number, 
  1408 	   typename CapacityMap, typename FlowMap>
  1409   class ResGraphWrapper : 
  1410     public SubBidirGraphWrapper< 
  1411     Graph, 
  1412     ForwardFilter<Graph, Number, CapacityMap, FlowMap>,  
  1413     BackwardFilter<Graph, Number, CapacityMap, FlowMap> > {
  1414   public:
  1415     typedef SubBidirGraphWrapper< 
  1416       Graph, 
  1417       ForwardFilter<Graph, Number, CapacityMap, FlowMap>,  
  1418       BackwardFilter<Graph, Number, CapacityMap, FlowMap> > Parent;
  1419   protected:
  1420     const CapacityMap* capacity;
  1421     FlowMap* flow;
  1422     ForwardFilter<Graph, Number, CapacityMap, FlowMap> forward_filter;
  1423     BackwardFilter<Graph, Number, CapacityMap, FlowMap> backward_filter;
  1424   public:
  1425     ResGraphWrapper(Graph& _graph, const CapacityMap& _capacity, 
  1426 		       FlowMap& _flow) : 
  1427       Parent(), capacity(&_capacity), flow(&_flow), 
  1428       forward_filter(_graph, _capacity, _flow), 
  1429       backward_filter(_graph, _capacity, _flow) {
  1430       Parent::setGraph(_graph);
  1431       Parent::setForwardFilterMap(forward_filter);
  1432       Parent::setBackwardFilterMap(backward_filter);
  1433     }
  1434 
  1435     //    bool forward(const Parent::Edge& e) const { return Parent::forward(e); }
  1436     //bool backward(const Edge& e) const { return e.backward; }
  1437 
  1438     void augment(const typename Parent::Edge& e, Number a) const {
  1439       if (Parent::forward(e))  
  1440 // 	flow->set(e.out, flow->get(e.out)+a);
  1441 	flow->set(e, (*flow)[e]+a);
  1442       else  
  1443 	//flow->set(e.in, flow->get(e.in)-a);
  1444 	flow->set(e, (*flow)[e]-a);
  1445     }
  1446 
  1447     Number resCap(const typename Parent::Edge& e) const { 
  1448       if (Parent::forward(e)) 
  1449 //	return (capacity->get(e.out)-flow->get(e.out)); 
  1450 	return ((*capacity)[e]-(*flow)[e]); 
  1451       else 
  1452 //	return (flow->get(e.in)); 
  1453 	return ((*flow)[e]); 
  1454     }
  1455 
  1456   };
  1457 
  1458 
  1459 
  1460 
  1461   template<typename Graph, typename Number, 
  1462 	   typename CapacityMap, typename FlowMap>
  1463   class OldResGraphWrapper : public GraphWrapper<Graph> {
  1464   public:
  1465     typedef GraphWrapper<Graph> Parent; 
  1466   protected:
  1467     const CapacityMap* capacity;
  1468     FlowMap* flow;
  1469 
  1470     OldResGraphWrapper() : GraphWrapper<Graph>(0), 
  1471 			capacity(0), flow(0) { }
  1472     void setCapacityMap(const CapacityMap& _capacity) {
  1473       capacity=&_capacity;
  1474     }
  1475     void setFlowMap(FlowMap& _flow) {
  1476       flow=&_flow;
  1477     }
  1478 
  1479   public:
  1480 
  1481     OldResGraphWrapper(Graph& _graph, const CapacityMap& _capacity, 
  1482 		    FlowMap& _flow) : 
  1483       GraphWrapper<Graph>(_graph), capacity(&_capacity), flow(&_flow) { }
  1484 
  1485     class Edge; 
  1486     class OutEdgeIt; 
  1487     friend class Edge; 
  1488     friend class OutEdgeIt; 
  1489 
  1490     typedef typename GraphWrapper<Graph>::Node Node;
  1491     typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
  1492     class Edge : public Graph::Edge {
  1493       friend class OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
  1494     protected:
  1495       bool backward; //true, iff backward
  1496 //      typename Graph::Edge e;
  1497     public:
  1498       Edge() { }
  1499       Edge(const typename Graph::Edge& _e, bool _backward) : 
  1500 	Graph::Edge(_e), backward(_backward) { }
  1501       Edge(const Invalid& i) : Graph::Edge(i), backward(true) { }
  1502 //the unique invalid iterator
  1503       friend bool operator==(const Edge& u, const Edge& v) { 
  1504 	return (v.backward==u.backward && 
  1505 		static_cast<typename Graph::Edge>(u)==
  1506 		static_cast<typename Graph::Edge>(v));
  1507       } 
  1508       friend bool operator!=(const Edge& u, const Edge& v) { 
  1509 	return (v.backward!=u.backward || 
  1510 		static_cast<typename Graph::Edge>(u)!=
  1511 		static_cast<typename Graph::Edge>(v));
  1512       } 
  1513     };
  1514 
  1515     class OutEdgeIt {
  1516       friend class OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
  1517     protected:
  1518       typename Graph::OutEdgeIt out;
  1519       typename Graph::InEdgeIt in;
  1520       bool backward;
  1521     public:
  1522       OutEdgeIt() { }
  1523       //FIXME
  1524 //      OutEdgeIt(const Edge& e) : Edge(e) { }
  1525       OutEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
  1526 //the unique invalid iterator
  1527       OutEdgeIt(const OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, Node v) { 
  1528 	backward=false;
  1529 	_G.graph->first(out, v);
  1530 	while( _G.graph->valid(out) && !(_G.resCap(*this)>0) ) { _G.graph->next(out); }
  1531 	if (!_G.graph->valid(out)) {
  1532 	  backward=true;
  1533 	  _G.graph->first(in, v);
  1534 	  while( _G.graph->valid(in) && !(_G.resCap(*this)>0) ) { _G.graph->next(in); }
  1535 	}
  1536       }
  1537       operator Edge() const { 
  1538 //	Edge e;
  1539 //	e.forward=this->forward;
  1540 //	if (this->forward) e=out; else e=in;
  1541 //	return e;
  1542 	if (this->backward) 
  1543 	  return Edge(in, this->backward); 
  1544 	else 
  1545 	  return Edge(out, this->backward);
  1546       }
  1547     };
  1548 
  1549     class InEdgeIt {
  1550       friend class OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
  1551     protected:
  1552       typename Graph::OutEdgeIt out;
  1553       typename Graph::InEdgeIt in;
  1554       bool backward;
  1555     public:
  1556       InEdgeIt() { }
  1557       //FIXME
  1558 //      OutEdgeIt(const Edge& e) : Edge(e) { }
  1559       InEdgeIt(const Invalid& i) : out(i), in(i), backward(true) { }
  1560 //the unique invalid iterator
  1561       InEdgeIt(const OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, Node v) { 
  1562 	backward=false;
  1563 	_G.graph->first(in, v);
  1564 	while( _G.graph->valid(in) && !(_G.resCap(*this)>0) ) { _G.graph->next(in); }
  1565 	if (!_G.graph->valid(in)) {
  1566 	  backward=true;
  1567 	  _G.graph->first(out, v);
  1568 	  while( _G.graph->valid(out) && !(_G.resCap(*this)>0) ) { _G.graph->next(out); }
  1569 	}
  1570       }
  1571       operator Edge() const { 
  1572 //	Edge e;
  1573 //	e.forward=this->forward;
  1574 //	if (this->forward) e=out; else e=in;
  1575 //	return e;
  1576 	if (this->backward) 
  1577 	  return Edge(out, this->backward); 
  1578 	else 
  1579 	  return Edge(in, this->backward);
  1580       }
  1581     };
  1582 
  1583     class EdgeIt {
  1584       friend class OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>;
  1585     protected:
  1586       typename Graph::EdgeIt e;
  1587       bool backward;
  1588     public:
  1589       EdgeIt() { }
  1590       EdgeIt(const Invalid& i) : e(i), backward(true) { }
  1591       EdgeIt(const OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G) { 
  1592 	backward=false;
  1593 	_G.graph->first(e);
  1594 	while (_G.graph->valid(e) && !(_G.resCap(*this)>0)) _G.graph->next(e);
  1595 	if (!_G.graph->valid(e)) {
  1596 	  backward=true;
  1597 	  _G.graph->first(e);
  1598 	  while (_G.graph->valid(e) && !(_G.resCap(*this)>0)) _G.graph->next(e);
  1599 	}
  1600       }
  1601       operator Edge() const { 
  1602 	return Edge(e, this->backward);
  1603       }
  1604     };
  1605 
  1606     using GraphWrapper<Graph>::first;
  1607 //     NodeIt& first(NodeIt& i) const { 
  1608 //       i=NodeIt(*this); return i;
  1609 //     }
  1610     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
  1611       i=OutEdgeIt(*this, p); return i;
  1612     }
  1613 //    FIXME not tested
  1614     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
  1615       i=InEdgeIt(*this, p); return i;
  1616     }
  1617     EdgeIt& first(EdgeIt& i) const { 
  1618       i=EdgeIt(*this); return i;
  1619     }
  1620   
  1621     using GraphWrapper<Graph>::next;
  1622 //    NodeIt& next(NodeIt& n) const { GraphWrapper<Graph>::next(n); return n; }
  1623     OutEdgeIt& next(OutEdgeIt& e) const { 
  1624       if (!e.backward) {
  1625 	Node v=this->graph->aNode(e.out);
  1626 	this->graph->next(e.out);
  1627 	while( this->graph->valid(e.out) && !(resCap(e)>0) ) { 
  1628 	  this->graph->next(e.out); }
  1629 	if (!this->graph->valid(e.out)) {
  1630 	  e.backward=true;
  1631 	  this->graph->first(e.in, v); 
  1632 	  while( this->graph->valid(e.in) && !(resCap(e)>0) ) { 
  1633 	    this->graph->next(e.in); }
  1634 	}
  1635       } else {
  1636 	this->graph->next(e.in);
  1637 	while( this->graph->valid(e.in) && !(resCap(e)>0) ) { 
  1638 	  this->graph->next(e.in); } 
  1639       }
  1640       return e;
  1641     }
  1642 //     FIXME Not tested
  1643     InEdgeIt& next(InEdgeIt& e) const { 
  1644       if (!e.backward) {
  1645 	Node v=this->graph->aNode(e.in);
  1646 	this->graph->next(e.in);
  1647 	while( this->graph->valid(e.in) && !(resCap(e)>0) ) { 
  1648 	  this->graph->next(e.in); }
  1649 	if (!this->graph->valid(e.in)) {
  1650 	  e.backward=true;
  1651 	  this->graph->first(e.out, v); 
  1652 	  while( this->graph->valid(e.out) && !(resCap(e)>0) ) { 
  1653 	    this->graph->next(e.out); }
  1654 	}
  1655       } else {
  1656 	this->graph->next(e.out);
  1657 	while( this->graph->valid(e.out) && !(resCap(e)>0) ) { 
  1658 	  this->graph->next(e.out); } 
  1659       }
  1660       return e;
  1661     }
  1662     EdgeIt& next(EdgeIt& e) const {
  1663       if (!e.backward) {
  1664 	this->graph->next(e.e);
  1665 	while( this->graph->valid(e.e) && !(resCap(e)>0) ) { 
  1666 	  this->graph->next(e.e); }
  1667 	if (!this->graph->valid(e.e)) {
  1668 	  e.backward=true;
  1669 	  this->graph->first(e.e); 
  1670 	  while( this->graph->valid(e.e) && !(resCap(e)>0) ) { 
  1671 	    this->graph->next(e.e); }
  1672 	}
  1673       } else {
  1674 	this->graph->next(e.e);
  1675 	while( this->graph->valid(e.e) && !(resCap(e)>0) ) { 
  1676 	  this->graph->next(e.e); } 
  1677       }
  1678       return e;
  1679     }
  1680 
  1681     Node tail(Edge e) const { 
  1682       return ((!e.backward) ? this->graph->tail(e) : this->graph->head(e)); }
  1683     Node head(Edge e) const { 
  1684       return ((!e.backward) ? this->graph->head(e) : this->graph->tail(e)); }
  1685 
  1686     Node aNode(OutEdgeIt e) const { 
  1687       return ((!e.backward) ? this->graph->aNode(e.out) : 
  1688 	      this->graph->aNode(e.in)); }
  1689     Node bNode(OutEdgeIt e) const { 
  1690       return ((!e.backward) ? this->graph->bNode(e.out) : 
  1691 	      this->graph->bNode(e.in)); }
  1692 
  1693     Node aNode(InEdgeIt e) const { 
  1694       return ((!e.backward) ? this->graph->aNode(e.in) : 
  1695 	      this->graph->aNode(e.out)); }
  1696     Node bNode(InEdgeIt e) const { 
  1697       return ((!e.backward) ? this->graph->bNode(e.in) : 
  1698 	      this->graph->bNode(e.out)); }
  1699 
  1700 //    int nodeNum() const { return graph->nodeNum(); }
  1701     //FIXME
  1702     void edgeNum() const { }
  1703     //int edgeNum() const { return graph->edgeNum(); }
  1704 
  1705 
  1706 //    int id(Node v) const { return graph->id(v); }
  1707 
  1708     bool valid(Node n) const { return GraphWrapper<Graph>::valid(n); }
  1709     bool valid(Edge e) const { 
  1710       return this->graph->valid(e);
  1711 	//return e.forward ? graph->valid(e.out) : graph->valid(e.in); 
  1712     }
  1713 
  1714     bool forward(const Edge& e) const { return !e.backward; }
  1715     bool backward(const Edge& e) const { return e.backward; }
  1716 
  1717     void augment(const Edge& e, Number a) const {
  1718       if (!e.backward)  
  1719 // 	flow->set(e.out, flow->get(e.out)+a);
  1720 	flow->set(e, (*flow)[e]+a);
  1721       else  
  1722 // 	flow->set(e.in, flow->get(e.in)-a);
  1723 	flow->set(e, (*flow)[e]-a);
  1724     }
  1725 
  1726     Number resCap(const Edge& e) const { 
  1727       if (!e.backward) 
  1728 //	return (capacity->get(e.out)-flow->get(e.out)); 
  1729 	return ((*capacity)[e]-(*flow)[e]); 
  1730       else 
  1731 //	return (flow->get(e.in)); 
  1732 	return ((*flow)[e]); 
  1733     }
  1734 
  1735 //     Number resCap(typename Graph::OutEdgeIt out) const { 
  1736 // //      return (capacity->get(out)-flow->get(out)); 
  1737 //       return ((*capacity)[out]-(*flow)[out]); 
  1738 //     }
  1739     
  1740 //     Number resCap(typename Graph::InEdgeIt in) const { 
  1741 // //      return (flow->get(in)); 
  1742 //       return ((*flow)[in]); 
  1743 //     }
  1744 
  1745     template <typename T>
  1746     class EdgeMap {
  1747       typename Graph::template EdgeMap<T> forward_map, backward_map; 
  1748     public:
  1749       typedef T ValueType;
  1750       typedef Edge KeyType;
  1751       EdgeMap(const OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
  1752       EdgeMap(const OldResGraphWrapper<Graph, Number, CapacityMap, FlowMap>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
  1753       void set(Edge e, T a) { 
  1754 	if (!e.backward) 
  1755 	  forward_map.set(e/*.out*/, a); 
  1756 	else 
  1757 	  backward_map.set(e/*.in*/, a); 
  1758       }
  1759       T operator[](Edge e) const { 
  1760 	if (!e.backward) 
  1761 	  return forward_map[e/*.out*/]; 
  1762 	else 
  1763 	  return backward_map[e/*.in*/]; 
  1764       }
  1765       void update() { 
  1766 	forward_map.update(); 
  1767 	backward_map.update();
  1768       }
  1769 //       T get(Edge e) const { 
  1770 // 	if (e.out_or_in) 
  1771 // 	  return forward_map.get(e.out); 
  1772 // 	else 
  1773 // 	  return backward_map.get(e.in); 
  1774 //       }
  1775     };
  1776   };
  1777 
  1778 
  1779 
  1780   /// For blocking flows.
  1781 
  1782   /// This graph wrapper is used for Dinits blocking flow computations.
  1783   /// For each node, an out-edge is stored which is used when the 
  1784   /// \code 
  1785   /// OutEdgeIt& first(OutEdgeIt&, const Node&)
  1786   /// \endcode
  1787   /// is called. 
  1788   ///
  1789   ///\author Marton Makai
  1790   template<typename Graph, typename FirstOutEdgesMap>
  1791   class ErasingFirstGraphWrapper : public GraphWrapper<Graph> {
  1792   public:
  1793     typedef GraphWrapper<Graph> Parent; 
  1794   protected:
  1795     FirstOutEdgesMap* first_out_edges;
  1796   public:
  1797     ErasingFirstGraphWrapper(Graph& _graph, 
  1798 			     FirstOutEdgesMap& _first_out_edges) : 
  1799       GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { }  
  1800 
  1801     typedef typename GraphWrapper<Graph>::Node Node;
  1802 //     class NodeIt { 
  1803 //       friend class GraphWrapper<Graph>;
  1804 //       friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
  1805 //       typename Graph::NodeIt n;
  1806 //      public:
  1807 //       NodeIt() { }
  1808 //       NodeIt(const typename Graph::NodeIt& _n) : n(_n) { }
  1809 //       NodeIt(const Invalid& i) : n(i) { }
  1810 //       NodeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) : 
  1811 // 	n(*(_G.graph)) { }
  1812 //       operator Node() const { return Node(typename Graph::Node(n)); }
  1813 //     };
  1814     typedef typename GraphWrapper<Graph>::Edge Edge;
  1815     class OutEdgeIt { 
  1816       friend class GraphWrapper<Graph>;
  1817       friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
  1818 //      typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
  1819       typename Graph::OutEdgeIt e;
  1820     public:
  1821       OutEdgeIt() { }
  1822       OutEdgeIt(const typename Graph::OutEdgeIt& _e) : e(_e) { }
  1823       OutEdgeIt(const Invalid& i) : e(i) { }
  1824       OutEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G, 
  1825 		const Node& _n) : 
  1826 	e((*_G.first_out_edges)[_n]) { }
  1827       operator Edge() const { return Edge(typename Graph::Edge(e)); }
  1828     };
  1829     class InEdgeIt { 
  1830       friend class GraphWrapper<Graph>;
  1831       friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
  1832 //      typedef typename Graph::InEdgeIt GraphInEdgeIt;
  1833       typename Graph::InEdgeIt e;
  1834     public:
  1835       InEdgeIt() { }
  1836       InEdgeIt(const typename Graph::InEdgeIt& _e) : e(_e) { }
  1837       InEdgeIt(const Invalid& i) : e(i) { }
  1838       InEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G, 
  1839 	       const Node& _n) : 
  1840 	e(*(_G.graph), typename Graph::Node(_n)) { }
  1841       operator Edge() const { return Edge(typename Graph::Edge(e)); }
  1842     };
  1843     //typedef typename Graph::SymEdgeIt SymEdgeIt;
  1844     class EdgeIt { 
  1845       friend class GraphWrapper<Graph>;
  1846       friend class ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>;
  1847 //      typedef typename Graph::EdgeIt GraphEdgeIt;
  1848       typename Graph::EdgeIt e;
  1849     public:
  1850       EdgeIt() { }
  1851       EdgeIt(const typename Graph::EdgeIt& _e) : e(_e) { }
  1852       EdgeIt(const Invalid& i) : e(i) { }
  1853       EdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) : 
  1854 	e(*(_G.graph)) { }
  1855       operator Edge() const { return Edge(typename Graph::Edge(e)); }
  1856     };
  1857 
  1858     using GraphWrapper<Graph>::first;
  1859 //     NodeIt& first(NodeIt& i) const { 
  1860 //       i=NodeIt(*this); return i;
  1861 //     }
  1862     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
  1863       i=OutEdgeIt(*this, p); return i;
  1864     }
  1865     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
  1866       i=InEdgeIt(*this, p); return i;
  1867     }
  1868     EdgeIt& first(EdgeIt& i) const { 
  1869       i=EdgeIt(*this); return i;
  1870     }
  1871 
  1872     using GraphWrapper<Graph>::next;
  1873 //    NodeIt& next(NodeIt& i) const { graph->next(i.n); return i; }
  1874     OutEdgeIt& next(OutEdgeIt& i) const { this->graph->next(i.e); return i; }
  1875     InEdgeIt& next(InEdgeIt& i) const { this->graph->next(i.e); return i; }
  1876     EdgeIt& next(EdgeIt& i) const { this->graph->next(i.e); return i; }    
  1877     
  1878     Node aNode(const OutEdgeIt& e) const { 
  1879       return Node(this->graph->aNode(e.e)); }
  1880     Node aNode(const InEdgeIt& e) const { 
  1881       return Node(this->graph->aNode(e.e)); }
  1882     Node bNode(const OutEdgeIt& e) const { 
  1883       return Node(this->graph->bNode(e.e)); }
  1884     Node bNode(const InEdgeIt& e) const { 
  1885       return Node(this->graph->bNode(e.e)); }
  1886 
  1887     void erase(const OutEdgeIt& e) const {
  1888       OutEdgeIt f=e;
  1889       this->next(f);
  1890       first_out_edges->set(this->tail(e), f.e);
  1891     }
  1892   };
  1893 
  1894   ///@}
  1895 
  1896 } //namespace hugo
  1897 
  1898 #endif //HUGO_GRAPH_WRAPPER_H
  1899