lemon/graph_adaptor.h
author alpar
Tue, 21 Feb 2006 12:37:00 +0000
changeset 1977 8ef02f0c4245
parent 1956 a055123339d5
child 1979 c2992fd74dad
permissions -rw-r--r--
RefPtr: a reference counted pointer class
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2006
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 #ifndef LEMON_GRAPH_ADAPTOR_H
    20 #define LEMON_GRAPH_ADAPTOR_H
    21 
    22 ///\ingroup graph_adaptors
    23 ///\file
    24 ///\brief Several graph adaptors.
    25 ///
    26 ///This file contains several useful graph adaptor functions.
    27 ///
    28 ///\author Marton Makai
    29 
    30 #include <lemon/invalid.h>
    31 #include <lemon/maps.h>
    32 #include <lemon/bits/erasable_graph_extender.h>
    33 #include <lemon/bits/clearable_graph_extender.h>
    34 #include <lemon/bits/extendable_graph_extender.h>
    35 #include <lemon/bits/iterable_graph_extender.h>
    36 #include <lemon/bits/alteration_notifier.h>
    37 #include <lemon/bits/default_map.h>
    38 #include <lemon/bits/graph_extender.h>
    39 #include <iostream>
    40 
    41 namespace lemon {
    42 
    43   ///\brief Base type for the Graph Adaptors
    44   ///\ingroup graph_adaptors
    45   ///
    46   ///Base type for the Graph Adaptors
    47   ///
    48   ///\warning Graph adaptors are in even
    49   ///more experimental state than the other
    50   ///parts of the lib. Use them at you own risk.
    51   ///
    52   ///This is the base type for most of LEMON graph adaptors. 
    53   ///This class implements a trivial graph adaptor i.e. it only wraps the 
    54   ///functions and types of the graph. The purpose of this class is to 
    55   ///make easier implementing graph adaptors. E.g. if an adaptor is 
    56   ///considered which differs from the wrapped graph only in some of its 
    57   ///functions or types, then it can be derived from GraphAdaptor,
    58   ///and only the 
    59   ///differences should be implemented.
    60   ///
    61   ///author Marton Makai 
    62   template<typename _Graph>
    63   class GraphAdaptorBase {
    64   public:
    65     typedef _Graph Graph;
    66     typedef Graph ParentGraph;
    67 
    68   protected:
    69     Graph* graph;
    70     GraphAdaptorBase() : graph(0) { }
    71     void setGraph(Graph& _graph) { graph=&_graph; }
    72 
    73   public:
    74     GraphAdaptorBase(Graph& _graph) : graph(&_graph) { }
    75  
    76     typedef typename Graph::Node Node;
    77     typedef typename Graph::Edge Edge;
    78    
    79     void first(Node& i) const { graph->first(i); }
    80     void first(Edge& i) const { graph->first(i); }
    81     void firstIn(Edge& i, const Node& n) const { graph->firstIn(i, n); }
    82     void firstOut(Edge& i, const Node& n ) const { graph->firstOut(i, n); }
    83 
    84     void next(Node& i) const { graph->next(i); }
    85     void next(Edge& i) const { graph->next(i); }
    86     void nextIn(Edge& i) const { graph->nextIn(i); }
    87     void nextOut(Edge& i) const { graph->nextOut(i); }
    88 
    89     Node source(const Edge& e) const { return graph->source(e); }
    90     Node target(const Edge& e) const { return graph->target(e); }
    91 
    92     typedef NodeNumTagIndicator<Graph> NodeNumTag;
    93     int nodeNum() const { return graph->nodeNum(); }
    94     
    95     typedef EdgeNumTagIndicator<Graph> EdgeNumTag;
    96     int edgeNum() const { return graph->edgeNum(); }
    97 
    98     typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
    99     Edge findEdge(const Node& source, const Node& target, 
   100 		  const Edge& prev = INVALID) {
   101       return graph->findEdge(source, target, prev);
   102     }
   103   
   104     Node addNode() const { 
   105       return Node(graph->addNode()); 
   106     }
   107 
   108     Edge addEdge(const Node& source, const Node& target) const { 
   109       return Edge(graph->addEdge(source, target)); 
   110     }
   111 
   112     void erase(const Node& i) const { graph->erase(i); }
   113     void erase(const Edge& i) const { graph->erase(i); }
   114   
   115     void clear() const { graph->clear(); }
   116     
   117     int id(const Node& v) const { return graph->id(v); }
   118     int id(const Edge& e) const { return graph->id(e); }
   119     
   120     Edge oppositeNode(const Edge& e) const { 
   121       return Edge(graph->opposite(e)); 
   122     }
   123 
   124     template <typename _Value>
   125     class NodeMap : public _Graph::template NodeMap<_Value> {
   126     public:
   127       typedef typename _Graph::template NodeMap<_Value> Parent;
   128       explicit NodeMap(const GraphAdaptorBase<_Graph>& gw) 
   129 	: Parent(*gw.graph) { }
   130       NodeMap(const GraphAdaptorBase<_Graph>& gw, const _Value& value)
   131 	: Parent(*gw.graph, value) { }
   132     };
   133 
   134     template <typename _Value>
   135     class EdgeMap : public _Graph::template EdgeMap<_Value> {
   136     public:
   137       typedef typename _Graph::template EdgeMap<_Value> Parent;
   138       explicit EdgeMap(const GraphAdaptorBase<_Graph>& gw) 
   139 	: Parent(*gw.graph) { }
   140       EdgeMap(const GraphAdaptorBase<_Graph>& gw, const _Value& value)
   141 	: Parent(*gw.graph, value) { }
   142     };
   143 
   144   };
   145 
   146   template <typename _Graph>
   147   class GraphAdaptor :
   148     public IterableGraphExtender<GraphAdaptorBase<_Graph> > { 
   149   public:
   150     typedef _Graph Graph;
   151     typedef IterableGraphExtender<GraphAdaptorBase<_Graph> > Parent;
   152   protected:
   153     GraphAdaptor() : Parent() { }
   154 
   155   public:
   156     explicit GraphAdaptor(Graph& _graph) { setGraph(_graph); }
   157   };
   158 
   159   template <typename _Graph>
   160   class RevGraphAdaptorBase : public GraphAdaptorBase<_Graph> {
   161   public:
   162     typedef _Graph Graph;
   163     typedef GraphAdaptorBase<_Graph> Parent;
   164   protected:
   165     RevGraphAdaptorBase() : Parent() { }
   166   public:
   167     typedef typename Parent::Node Node;
   168     typedef typename Parent::Edge Edge;
   169 
   170     void firstIn(Edge& i, const Node& n) const { Parent::firstOut(i, n); }
   171     void firstOut(Edge& i, const Node& n ) const { Parent::firstIn(i, n); }
   172 
   173     void nextIn(Edge& i) const { Parent::nextOut(i); }
   174     void nextOut(Edge& i) const { Parent::nextIn(i); }
   175 
   176     Node source(const Edge& e) const { return Parent::target(e); }
   177     Node target(const Edge& e) const { return Parent::source(e); }
   178   };
   179     
   180 
   181   ///\brief A graph adaptor which reverses the orientation of the edges.
   182   ///\ingroup graph_adaptors
   183   ///
   184   ///\warning Graph adaptors are in even more experimental 
   185   ///state than the other
   186   ///parts of the lib. Use them at you own risk.
   187   ///
   188   /// If \c g is defined as
   189   ///\code
   190   /// ListGraph g;
   191   ///\endcode
   192   /// then
   193   ///\code
   194   /// RevGraphAdaptor<ListGraph> gw(g);
   195   ///\endcode
   196   ///implements the graph obtained from \c g by 
   197   /// reversing the orientation of its edges.
   198 
   199   template<typename _Graph>
   200   class RevGraphAdaptor : 
   201     public IterableGraphExtender<RevGraphAdaptorBase<_Graph> > {
   202   public:
   203     typedef _Graph Graph;
   204     typedef IterableGraphExtender<
   205       RevGraphAdaptorBase<_Graph> > Parent;
   206   protected:
   207     RevGraphAdaptor() { }
   208   public:
   209     explicit RevGraphAdaptor(_Graph& _graph) { setGraph(_graph); }
   210   };
   211 
   212   
   213   template <typename _Graph, typename NodeFilterMap, 
   214 	    typename EdgeFilterMap, bool checked = true>
   215   class SubGraphAdaptorBase : public GraphAdaptorBase<_Graph> {
   216   public:
   217     typedef _Graph Graph;
   218     typedef GraphAdaptorBase<_Graph> Parent;
   219   protected:
   220     NodeFilterMap* node_filter_map;
   221     EdgeFilterMap* edge_filter_map;
   222     SubGraphAdaptorBase() : Parent(), 
   223 			    node_filter_map(0), edge_filter_map(0) { }
   224 
   225     void setNodeFilterMap(NodeFilterMap& _node_filter_map) {
   226       node_filter_map=&_node_filter_map;
   227     }
   228     void setEdgeFilterMap(EdgeFilterMap& _edge_filter_map) {
   229       edge_filter_map=&_edge_filter_map;
   230     }
   231 
   232   public:
   233 
   234     typedef typename Parent::Node Node;
   235     typedef typename Parent::Edge Edge;
   236 
   237     void first(Node& i) const { 
   238       Parent::first(i); 
   239       while (i!=INVALID && !(*node_filter_map)[i]) Parent::next(i); 
   240     }
   241 
   242     void first(Edge& i) const { 
   243       Parent::first(i); 
   244       while (i!=INVALID && (!(*edge_filter_map)[i] 
   245 	     || !(*node_filter_map)[Parent::source(i)]
   246 	     || !(*node_filter_map)[Parent::target(i)])) Parent::next(i); 
   247     }
   248 
   249     void firstIn(Edge& i, const Node& n) const { 
   250       Parent::firstIn(i, n); 
   251       while (i!=INVALID && (!(*edge_filter_map)[i] 
   252 	     || !(*node_filter_map)[Parent::source(i)])) Parent::nextIn(i); 
   253     }
   254 
   255     void firstOut(Edge& i, const Node& n) const { 
   256       Parent::firstOut(i, n); 
   257       while (i!=INVALID && (!(*edge_filter_map)[i] 
   258 	     || !(*node_filter_map)[Parent::target(i)])) Parent::nextOut(i); 
   259     }
   260 
   261     void next(Node& i) const { 
   262       Parent::next(i); 
   263       while (i!=INVALID && !(*node_filter_map)[i]) Parent::next(i); 
   264     }
   265 
   266     void next(Edge& i) const { 
   267       Parent::next(i); 
   268       while (i!=INVALID && (!(*edge_filter_map)[i] 
   269 	     || !(*node_filter_map)[Parent::source(i)]
   270 	     || !(*node_filter_map)[Parent::target(i)])) Parent::next(i); 
   271     }
   272 
   273     void nextIn(Edge& i) const { 
   274       Parent::nextIn(i); 
   275       while (i!=INVALID && (!(*edge_filter_map)[i] 
   276 	     || !(*node_filter_map)[Parent::source(i)])) Parent::nextIn(i); 
   277     }
   278 
   279     void nextOut(Edge& i) const { 
   280       Parent::nextOut(i); 
   281       while (i!=INVALID && (!(*edge_filter_map)[i] 
   282 	     || !(*node_filter_map)[Parent::target(i)])) Parent::nextOut(i); 
   283     }
   284 
   285     ///\e
   286 
   287     /// This function hides \c n in the graph, i.e. the iteration 
   288     /// jumps over it. This is done by simply setting the value of \c n  
   289     /// to be false in the corresponding node-map.
   290     void hide(const Node& n) const { node_filter_map->set(n, false); }
   291 
   292     ///\e
   293 
   294     /// This function hides \c e in the graph, i.e. the iteration 
   295     /// jumps over it. This is done by simply setting the value of \c e  
   296     /// to be false in the corresponding edge-map.
   297     void hide(const Edge& e) const { edge_filter_map->set(e, false); }
   298 
   299     ///\e
   300 
   301     /// The value of \c n is set to be true in the node-map which stores 
   302     /// hide information. If \c n was hidden previuosly, then it is shown 
   303     /// again
   304      void unHide(const Node& n) const { node_filter_map->set(n, true); }
   305 
   306     ///\e
   307 
   308     /// The value of \c e is set to be true in the edge-map which stores 
   309     /// hide information. If \c e was hidden previuosly, then it is shown 
   310     /// again
   311     void unHide(const Edge& e) const { edge_filter_map->set(e, true); }
   312 
   313     /// Returns true if \c n is hidden.
   314     
   315     ///\e
   316     ///
   317     bool hidden(const Node& n) const { return !(*node_filter_map)[n]; }
   318 
   319     /// Returns true if \c n is hidden.
   320     
   321     ///\e
   322     ///
   323     bool hidden(const Edge& e) const { return !(*edge_filter_map)[e]; }
   324 
   325     typedef False NodeNumTag;
   326     typedef False EdgeNumTag;
   327   };
   328 
   329   template <typename _Graph, typename NodeFilterMap, typename EdgeFilterMap>
   330   class SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap, false> 
   331     : public GraphAdaptorBase<_Graph> {
   332   public:
   333     typedef _Graph Graph;
   334     typedef GraphAdaptorBase<_Graph> Parent;
   335   protected:
   336     NodeFilterMap* node_filter_map;
   337     EdgeFilterMap* edge_filter_map;
   338     SubGraphAdaptorBase() : Parent(), 
   339 			    node_filter_map(0), edge_filter_map(0) { }
   340 
   341     void setNodeFilterMap(NodeFilterMap& _node_filter_map) {
   342       node_filter_map=&_node_filter_map;
   343     }
   344     void setEdgeFilterMap(EdgeFilterMap& _edge_filter_map) {
   345       edge_filter_map=&_edge_filter_map;
   346     }
   347 
   348   public:
   349 
   350     typedef typename Parent::Node Node;
   351     typedef typename Parent::Edge Edge;
   352 
   353     void first(Node& i) const { 
   354       Parent::first(i); 
   355       while (i!=INVALID && !(*node_filter_map)[i]) Parent::next(i); 
   356     }
   357 
   358     void first(Edge& i) const { 
   359       Parent::first(i); 
   360       while (i!=INVALID && !(*edge_filter_map)[i]) Parent::next(i); 
   361     }
   362 
   363     void firstIn(Edge& i, const Node& n) const { 
   364       Parent::firstIn(i, n); 
   365       while (i!=INVALID && !(*edge_filter_map)[i]) Parent::nextIn(i); 
   366     }
   367 
   368     void firstOut(Edge& i, const Node& n) const { 
   369       Parent::firstOut(i, n); 
   370       while (i!=INVALID && !(*edge_filter_map)[i]) Parent::nextOut(i); 
   371     }
   372 
   373     void next(Node& i) const { 
   374       Parent::next(i); 
   375       while (i!=INVALID && !(*node_filter_map)[i]) Parent::next(i); 
   376     }
   377     void next(Edge& i) const { 
   378       Parent::next(i); 
   379       while (i!=INVALID && !(*edge_filter_map)[i]) Parent::next(i); 
   380     }
   381     void nextIn(Edge& i) const { 
   382       Parent::nextIn(i); 
   383       while (i!=INVALID && !(*edge_filter_map)[i]) Parent::nextIn(i); 
   384     }
   385 
   386     void nextOut(Edge& i) const { 
   387       Parent::nextOut(i); 
   388       while (i!=INVALID && !(*edge_filter_map)[i]) Parent::nextOut(i); 
   389     }
   390 
   391     ///\e
   392 
   393     /// This function hides \c n in the graph, i.e. the iteration 
   394     /// jumps over it. This is done by simply setting the value of \c n  
   395     /// to be false in the corresponding node-map.
   396     void hide(const Node& n) const { node_filter_map->set(n, false); }
   397 
   398     ///\e
   399 
   400     /// This function hides \c e in the graph, i.e. the iteration 
   401     /// jumps over it. This is done by simply setting the value of \c e  
   402     /// to be false in the corresponding edge-map.
   403     void hide(const Edge& e) const { edge_filter_map->set(e, false); }
   404 
   405     ///\e
   406 
   407     /// The value of \c n is set to be true in the node-map which stores 
   408     /// hide information. If \c n was hidden previuosly, then it is shown 
   409     /// again
   410      void unHide(const Node& n) const { node_filter_map->set(n, true); }
   411 
   412     ///\e
   413 
   414     /// The value of \c e is set to be true in the edge-map which stores 
   415     /// hide information. If \c e was hidden previuosly, then it is shown 
   416     /// again
   417     void unHide(const Edge& e) const { edge_filter_map->set(e, true); }
   418 
   419     /// Returns true if \c n is hidden.
   420     
   421     ///\e
   422     ///
   423     bool hidden(const Node& n) const { return !(*node_filter_map)[n]; }
   424 
   425     /// Returns true if \c n is hidden.
   426     
   427     ///\e
   428     ///
   429     bool hidden(const Edge& e) const { return !(*edge_filter_map)[e]; }
   430 
   431     typedef False NodeNumTag;
   432     typedef False EdgeNumTag;
   433   };
   434 
   435   /// \brief A graph adaptor for hiding nodes and edges from a graph.
   436   /// \ingroup graph_adaptors
   437   /// 
   438   /// \warning Graph adaptors are in even more experimental state than the
   439   /// other parts of the lib. Use them at you own risk.
   440   /// 
   441   /// SubGraphAdaptor shows the graph with filtered node-set and 
   442   /// edge-set. If the \c checked parameter is true then it filters the edgeset
   443   /// to do not get invalid edges without source or target.
   444   /// Let \f$ G=(V, A) \f$ be a directed graph
   445   /// and suppose that the graph instance \c g of type ListGraph
   446   /// implements \f$ G \f$.
   447   /// Let moreover \f$ b_V \f$ and \f$ b_A \f$ be bool-valued functions resp.
   448   /// on the node-set and edge-set.
   449   /// SubGraphAdaptor<...>::NodeIt iterates 
   450   /// on the node-set \f$ \{v\in V : b_V(v)=true\} \f$ and 
   451   /// SubGraphAdaptor<...>::EdgeIt iterates 
   452   /// on the edge-set \f$ \{e\in A : b_A(e)=true\} \f$. Similarly, 
   453   /// SubGraphAdaptor<...>::OutEdgeIt and
   454   /// SubGraphAdaptor<...>::InEdgeIt iterates 
   455   /// only on edges leaving and entering a specific node which have true value.
   456   /// 
   457   /// If the \c checked template parameter is false then we have to note that 
   458   /// the node-iterator cares only the filter on the node-set, and the 
   459   /// edge-iterator cares only the filter on the edge-set.
   460   /// This way the edge-map
   461   /// should filter all edges which's source or target is filtered by the 
   462   /// node-filter.
   463   ///\code
   464   /// typedef ListGraph Graph;
   465   /// Graph g;
   466   /// typedef Graph::Node Node;
   467   /// typedef Graph::Edge Edge;
   468   /// Node u=g.addNode(); //node of id 0
   469   /// Node v=g.addNode(); //node of id 1
   470   /// Node e=g.addEdge(u, v); //edge of id 0
   471   /// Node f=g.addEdge(v, u); //edge of id 1
   472   /// Graph::NodeMap<bool> nm(g, true);
   473   /// nm.set(u, false);
   474   /// Graph::EdgeMap<bool> em(g, true);
   475   /// em.set(e, false);
   476   /// typedef SubGraphAdaptor<Graph, Graph::NodeMap<bool>, Graph::EdgeMap<bool> > SubGW;
   477   /// SubGW gw(g, nm, em);
   478   /// for (SubGW::NodeIt n(gw); n!=INVALID; ++n) std::cout << g.id(n) << std::endl;
   479   /// std::cout << ":-)" << std::endl;
   480   /// for (SubGW::EdgeIt e(gw); e!=INVALID; ++e) std::cout << g.id(e) << std::endl;
   481   ///\endcode
   482   /// The output of the above code is the following.
   483   ///\code
   484   /// 1
   485   /// :-)
   486   /// 1
   487   ///\endcode
   488   /// Note that \c n is of type \c SubGW::NodeIt, but it can be converted to
   489   /// \c Graph::Node that is why \c g.id(n) can be applied.
   490   /// 
   491   /// For other examples see also the documentation of NodeSubGraphAdaptor and 
   492   /// EdgeSubGraphAdaptor.
   493   /// 
   494   /// \author Marton Makai
   495 
   496   template<typename _Graph, typename NodeFilterMap, 
   497 	   typename EdgeFilterMap, bool checked = true>
   498   class SubGraphAdaptor : 
   499     public IterableGraphExtender<
   500     SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap, checked> > {
   501   public:
   502     typedef _Graph Graph;
   503     typedef IterableGraphExtender<
   504       SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap> > Parent;
   505   protected:
   506     SubGraphAdaptor() { }
   507   public:
   508     SubGraphAdaptor(_Graph& _graph, NodeFilterMap& _node_filter_map, 
   509 		    EdgeFilterMap& _edge_filter_map) { 
   510       setGraph(_graph);
   511       setNodeFilterMap(_node_filter_map);
   512       setEdgeFilterMap(_edge_filter_map);
   513     }
   514   };
   515 
   516 
   517 
   518   ///\brief An adaptor for hiding nodes from a graph.
   519   ///\ingroup graph_adaptors
   520   ///
   521   ///\warning Graph adaptors are in even more experimental state
   522   ///than the other
   523   ///parts of the lib. Use them at you own risk.
   524   ///
   525   ///An adaptor for hiding nodes from a graph.
   526   ///This adaptor specializes SubGraphAdaptor in the way that only
   527   ///the node-set 
   528   ///can be filtered. In usual case the checked parameter is true, we get the
   529   ///induced subgraph. But if the checked parameter is false then we can only
   530   ///filter only isolated nodes.
   531   ///\author Marton Makai
   532   template<typename Graph, typename NodeFilterMap, bool checked = true>
   533   class NodeSubGraphAdaptor : 
   534     public SubGraphAdaptor<Graph, NodeFilterMap, 
   535 			   ConstMap<typename Graph::Edge,bool>, checked> {
   536   public:
   537     typedef SubGraphAdaptor<Graph, NodeFilterMap, 
   538 			    ConstMap<typename Graph::Edge,bool> > Parent;
   539   protected:
   540     ConstMap<typename Graph::Edge, bool> const_true_map;
   541   public:
   542     NodeSubGraphAdaptor(Graph& _graph, NodeFilterMap& _node_filter_map) : 
   543       Parent(), const_true_map(true) { 
   544       Parent::setGraph(_graph);
   545       Parent::setNodeFilterMap(_node_filter_map);
   546       Parent::setEdgeFilterMap(const_true_map);
   547     }
   548   };
   549 
   550 
   551   ///\brief An adaptor for hiding edges from a graph.
   552   ///
   553   ///\warning Graph adaptors are in even more experimental state
   554   ///than the other parts of the lib. Use them at you own risk.
   555   ///
   556   ///An adaptor for hiding edges from a graph.
   557   ///This adaptor specializes SubGraphAdaptor in the way that
   558   ///only the edge-set 
   559   ///can be filtered. The usefulness of this adaptor is demonstrated in the 
   560   ///problem of searching a maximum number of edge-disjoint shortest paths 
   561   ///between 
   562   ///two nodes \c s and \c t. Shortest here means being shortest w.r.t. 
   563   ///non-negative edge-lengths. Note that 
   564   ///the comprehension of the presented solution 
   565   ///need's some elementary knowledge from combinatorial optimization. 
   566   ///
   567   ///If a single shortest path is to be 
   568   ///searched between \c s and \c t, then this can be done easily by 
   569   ///applying the Dijkstra algorithm. What happens, if a maximum number of 
   570   ///edge-disjoint shortest paths is to be computed. It can be proved that an 
   571   ///edge can be in a shortest path if and only
   572   ///if it is tight with respect to 
   573   ///the potential function computed by Dijkstra.
   574   ///Moreover, any path containing 
   575   ///only such edges is a shortest one.
   576   ///Thus we have to compute a maximum number 
   577   ///of edge-disjoint paths between \c s and \c t in
   578   ///the graph which has edge-set 
   579   ///all the tight edges. The computation will be demonstrated
   580   ///on the following 
   581   ///graph, which is read from the dimacs file \c sub_graph_adaptor_demo.dim. 
   582   ///The full source code is available in \ref sub_graph_adaptor_demo.cc. 
   583   ///If you are interested in more demo programs, you can use 
   584   ///\ref dim_to_dot.cc to generate .dot files from dimacs files. 
   585   ///The .dot file of the following figure was generated by  
   586   ///the demo program \ref dim_to_dot.cc.
   587   ///
   588   ///\dot
   589   ///digraph lemon_dot_example {
   590   ///node [ shape=ellipse, fontname=Helvetica, fontsize=10 ];
   591   ///n0 [ label="0 (s)" ];
   592   ///n1 [ label="1" ];
   593   ///n2 [ label="2" ];
   594   ///n3 [ label="3" ];
   595   ///n4 [ label="4" ];
   596   ///n5 [ label="5" ];
   597   ///n6 [ label="6 (t)" ];
   598   ///edge [ shape=ellipse, fontname=Helvetica, fontsize=10 ];
   599   ///n5 ->  n6 [ label="9, length:4" ];
   600   ///n4 ->  n6 [ label="8, length:2" ];
   601   ///n3 ->  n5 [ label="7, length:1" ];
   602   ///n2 ->  n5 [ label="6, length:3" ];
   603   ///n2 ->  n6 [ label="5, length:5" ];
   604   ///n2 ->  n4 [ label="4, length:2" ];
   605   ///n1 ->  n4 [ label="3, length:3" ];
   606   ///n0 ->  n3 [ label="2, length:1" ];
   607   ///n0 ->  n2 [ label="1, length:2" ];
   608   ///n0 ->  n1 [ label="0, length:3" ];
   609   ///}
   610   ///\enddot
   611   ///
   612   ///\code
   613   ///Graph g;
   614   ///Node s, t;
   615   ///LengthMap length(g);
   616   ///
   617   ///readDimacs(std::cin, g, length, s, t);
   618   ///
   619   ///cout << "edges with lengths (of form id, source--length->target): " << endl;
   620   ///for(EdgeIt e(g); e!=INVALID; ++e) 
   621   ///  cout << g.id(e) << ", " << g.id(g.source(e)) << "--" 
   622   ///       << length[e] << "->" << g.id(g.target(e)) << endl;
   623   ///
   624   ///cout << "s: " << g.id(s) << " t: " << g.id(t) << endl;
   625   ///\endcode
   626   ///Next, the potential function is computed with Dijkstra.
   627   ///\code
   628   ///typedef Dijkstra<Graph, LengthMap> Dijkstra;
   629   ///Dijkstra dijkstra(g, length);
   630   ///dijkstra.run(s);
   631   ///\endcode
   632   ///Next, we consrtruct a map which filters the edge-set to the tight edges.
   633   ///\code
   634   ///typedef TightEdgeFilterMap<Graph, const Dijkstra::DistMap, LengthMap> 
   635   ///  TightEdgeFilter;
   636   ///TightEdgeFilter tight_edge_filter(g, dijkstra.distMap(), length);
   637   ///
   638   ///typedef EdgeSubGraphAdaptor<Graph, TightEdgeFilter> SubGW;
   639   ///SubGW gw(g, tight_edge_filter);
   640   ///\endcode
   641   ///Then, the maximum nimber of edge-disjoint \c s-\c t paths are computed 
   642   ///with a max flow algorithm Preflow.
   643   ///\code
   644   ///ConstMap<Edge, int> const_1_map(1);
   645   ///Graph::EdgeMap<int> flow(g, 0);
   646   ///
   647   ///Preflow<SubGW, int, ConstMap<Edge, int>, Graph::EdgeMap<int> > 
   648   ///  preflow(gw, s, t, const_1_map, flow);
   649   ///preflow.run();
   650   ///\endcode
   651   ///Last, the output is:
   652   ///\code  
   653   ///cout << "maximum number of edge-disjoint shortest path: " 
   654   ///     << preflow.flowValue() << endl;
   655   ///cout << "edges of the maximum number of edge-disjoint shortest s-t paths: " 
   656   ///     << endl;
   657   ///for(EdgeIt e(g); e!=INVALID; ++e) 
   658   ///  if (flow[e])
   659   ///    cout << " " << g.id(g.source(e)) << "--"
   660   ///         << length[e] << "->" << g.id(g.target(e)) << endl;
   661   ///\endcode
   662   ///The program has the following (expected :-)) output:
   663   ///\code
   664   ///edges with lengths (of form id, source--length->target):
   665   /// 9, 5--4->6
   666   /// 8, 4--2->6
   667   /// 7, 3--1->5
   668   /// 6, 2--3->5
   669   /// 5, 2--5->6
   670   /// 4, 2--2->4
   671   /// 3, 1--3->4
   672   /// 2, 0--1->3
   673   /// 1, 0--2->2
   674   /// 0, 0--3->1
   675   ///s: 0 t: 6
   676   ///maximum number of edge-disjoint shortest path: 2
   677   ///edges of the maximum number of edge-disjoint shortest s-t paths:
   678   /// 9, 5--4->6
   679   /// 8, 4--2->6
   680   /// 7, 3--1->5
   681   /// 4, 2--2->4
   682   /// 2, 0--1->3
   683   /// 1, 0--2->2
   684   ///\endcode
   685   ///
   686   ///\author Marton Makai
   687   template<typename Graph, typename EdgeFilterMap>
   688   class EdgeSubGraphAdaptor : 
   689     public SubGraphAdaptor<Graph, ConstMap<typename Graph::Node,bool>, 
   690 			   EdgeFilterMap, false> {
   691   public:
   692     typedef SubGraphAdaptor<Graph, ConstMap<typename Graph::Node,bool>, 
   693 			    EdgeFilterMap, false> Parent;
   694   protected:
   695     ConstMap<typename Graph::Node, bool> const_true_map;
   696   public:
   697     EdgeSubGraphAdaptor(Graph& _graph, EdgeFilterMap& _edge_filter_map) : 
   698       Parent(), const_true_map(true) { 
   699       Parent::setGraph(_graph);
   700       Parent::setNodeFilterMap(const_true_map);
   701       Parent::setEdgeFilterMap(_edge_filter_map);
   702     }
   703   };
   704 
   705   template <typename _Graph>
   706   class UGraphAdaptorBase : 
   707     public UGraphExtender<GraphAdaptorBase<_Graph> > {
   708   public:
   709     typedef _Graph Graph;
   710     typedef UGraphExtender<GraphAdaptorBase<_Graph> > Parent;
   711   protected:
   712     UGraphAdaptorBase() : Parent() { }
   713   public:
   714     typedef typename Parent::UEdge UEdge;
   715     typedef typename Parent::Edge Edge;
   716     
   717     template <typename T>
   718     class EdgeMap {
   719     protected:
   720       const UGraphAdaptorBase<_Graph>* g;
   721       template <typename TT> friend class EdgeMap;
   722       typename _Graph::template EdgeMap<T> forward_map, backward_map; 
   723     public:
   724       typedef T Value;
   725       typedef Edge Key;
   726       
   727       EdgeMap(const UGraphAdaptorBase<_Graph>& _g) : g(&_g), 
   728 	forward_map(*(g->graph)), backward_map(*(g->graph)) { }
   729 
   730       EdgeMap(const UGraphAdaptorBase<_Graph>& _g, T a) : g(&_g), 
   731 	forward_map(*(g->graph), a), backward_map(*(g->graph), a) { }
   732       
   733       void set(Edge e, T a) { 
   734 	if (g->direction(e)) 
   735 	  forward_map.set(e, a); 
   736 	else 
   737 	  backward_map.set(e, a); 
   738       }
   739 
   740       T operator[](Edge e) const { 
   741 	if (g->direction(e)) 
   742 	  return forward_map[e]; 
   743 	else 
   744 	  return backward_map[e]; 
   745       }
   746     };
   747         
   748     template <typename T>
   749     class UEdgeMap {
   750       template <typename TT> friend class UEdgeMap;
   751       typename _Graph::template EdgeMap<T> map; 
   752     public:
   753       typedef T Value;
   754       typedef UEdge Key;
   755       
   756       UEdgeMap(const UGraphAdaptorBase<_Graph>& g) : 
   757 	map(*(g.graph)) { }
   758 
   759       UEdgeMap(const UGraphAdaptorBase<_Graph>& g, T a) : 
   760 	map(*(g.graph), a) { }
   761       
   762       void set(UEdge e, T a) { 
   763 	map.set(e, a); 
   764       }
   765 
   766       T operator[](UEdge e) const { 
   767 	return map[e]; 
   768       }
   769     };
   770       
   771   };
   772 
   773   ///\brief An undirected graph is made from a directed graph by an adaptor
   774   ///\ingroup graph_adaptors
   775   ///
   776   /// Undocumented, untested!!!
   777   /// If somebody knows nice demo application, let's polulate it.
   778   /// 
   779   /// \author Marton Makai
   780   template<typename _Graph>
   781   class UGraphAdaptor : 
   782     public IterableUGraphExtender<
   783     UGraphAdaptorBase<_Graph> > {
   784   public:
   785     typedef _Graph Graph;
   786     typedef IterableUGraphExtender<
   787       UGraphAdaptorBase<_Graph> > Parent;
   788   protected:
   789     UGraphAdaptor() { }
   790   public:
   791     UGraphAdaptor(_Graph& _graph) { 
   792       setGraph(_graph);
   793     }
   794   };
   795 
   796   
   797   template <typename _Graph, 
   798 	    typename ForwardFilterMap, typename BackwardFilterMap>
   799   class SubBidirGraphAdaptorBase : public GraphAdaptorBase<_Graph> {
   800   public:
   801     typedef _Graph Graph;
   802     typedef GraphAdaptorBase<_Graph> Parent;
   803   protected:
   804     ForwardFilterMap* forward_filter;
   805     BackwardFilterMap* backward_filter;
   806     SubBidirGraphAdaptorBase() : Parent(), 
   807 				 forward_filter(0), backward_filter(0) { }
   808 
   809     void setForwardFilterMap(ForwardFilterMap& _forward_filter) {
   810       forward_filter=&_forward_filter;
   811     }
   812     void setBackwardFilterMap(BackwardFilterMap& _backward_filter) {
   813       backward_filter=&_backward_filter;
   814     }
   815 
   816   public:
   817 //     SubGraphAdaptorBase(Graph& _graph, 
   818 // 			NodeFilterMap& _node_filter_map, 
   819 // 			EdgeFilterMap& _edge_filter_map) : 
   820 //       Parent(&_graph), 
   821 //       node_filter_map(&node_filter_map), 
   822 //       edge_filter_map(&edge_filter_map) { }
   823 
   824     typedef typename Parent::Node Node;
   825     typedef typename _Graph::Edge GraphEdge;
   826     template <typename T> class EdgeMap;
   827     // SubBidirGraphAdaptorBase<..., ..., ...>::Edge is inherited from 
   828     // _Graph::Edge. It contains an extra bool flag which is true 
   829     // if and only if the 
   830     // edge is the backward version of the original edge.
   831     class Edge : public _Graph::Edge {
   832       friend class SubBidirGraphAdaptorBase<
   833 	Graph, ForwardFilterMap, BackwardFilterMap>;
   834       template<typename T> friend class EdgeMap;
   835     protected:
   836       bool backward; //true, iff backward
   837     public:
   838       Edge() { }
   839       // \todo =false is needed, or causes problems?
   840       // If \c _backward is false, then we get an edge corresponding to the 
   841       // original one, otherwise its oppositely directed pair is obtained.
   842       Edge(const typename _Graph::Edge& e, bool _backward/*=false*/) : 
   843 	_Graph::Edge(e), backward(_backward) { }
   844       Edge(Invalid i) : _Graph::Edge(i), backward(true) { }
   845       bool operator==(const Edge& v) const { 
   846 	return (this->backward==v.backward && 
   847 		static_cast<typename _Graph::Edge>(*this)==
   848 		static_cast<typename _Graph::Edge>(v));
   849       } 
   850       bool operator!=(const Edge& v) const { 
   851 	return (this->backward!=v.backward || 
   852 		static_cast<typename _Graph::Edge>(*this)!=
   853 		static_cast<typename _Graph::Edge>(v));
   854       }
   855     };
   856 
   857     void first(Node& i) const { 
   858       Parent::first(i); 
   859     }
   860 
   861     void first(Edge& i) const { 
   862       Parent::first(i); 
   863       i.backward=false;
   864       while (*static_cast<GraphEdge*>(&i)!=INVALID && 
   865 	     !(*forward_filter)[i]) Parent::next(i);
   866       if (*static_cast<GraphEdge*>(&i)==INVALID) {
   867 	Parent::first(i); 
   868 	i.backward=true;
   869 	while (*static_cast<GraphEdge*>(&i)!=INVALID && 
   870 	       !(*backward_filter)[i]) Parent::next(i);
   871       }
   872     }
   873 
   874     void firstIn(Edge& i, const Node& n) const { 
   875       Parent::firstIn(i, n); 
   876       i.backward=false;
   877       while (*static_cast<GraphEdge*>(&i)!=INVALID && 
   878 	     !(*forward_filter)[i]) Parent::nextIn(i);
   879       if (*static_cast<GraphEdge*>(&i)==INVALID) {
   880 	Parent::firstOut(i, n); 
   881 	i.backward=true;
   882 	while (*static_cast<GraphEdge*>(&i)!=INVALID && 
   883 	       !(*backward_filter)[i]) Parent::nextOut(i);
   884       }
   885     }
   886 
   887     void firstOut(Edge& i, const Node& n) const { 
   888       Parent::firstOut(i, n); 
   889       i.backward=false;
   890       while (*static_cast<GraphEdge*>(&i)!=INVALID && 
   891 	     !(*forward_filter)[i]) Parent::nextOut(i);
   892       if (*static_cast<GraphEdge*>(&i)==INVALID) {
   893 	Parent::firstIn(i, n); 
   894 	i.backward=true;
   895 	while (*static_cast<GraphEdge*>(&i)!=INVALID && 
   896 	       !(*backward_filter)[i]) Parent::nextIn(i);
   897       }
   898     }
   899 
   900     void next(Node& i) const { 
   901       Parent::next(i); 
   902     }
   903 
   904     void next(Edge& i) const { 
   905       if (!(i.backward)) {
   906 	Parent::next(i);
   907 	while (*static_cast<GraphEdge*>(&i)!=INVALID && 
   908 	       !(*forward_filter)[i]) Parent::next(i);
   909 	if (*static_cast<GraphEdge*>(&i)==INVALID) {
   910 	  Parent::first(i); 
   911 	  i.backward=true;
   912 	  while (*static_cast<GraphEdge*>(&i)!=INVALID && 
   913 		 !(*backward_filter)[i]) Parent::next(i);
   914 	}
   915       } else {
   916 	Parent::next(i);
   917 	while (*static_cast<GraphEdge*>(&i)!=INVALID && 
   918 	       !(*backward_filter)[i]) Parent::next(i);
   919       }
   920     }
   921 
   922     void nextIn(Edge& i) const { 
   923       if (!(i.backward)) {
   924 	Node n=Parent::target(i);
   925 	Parent::nextIn(i);
   926 	while (*static_cast<GraphEdge*>(&i)!=INVALID && 
   927 	       !(*forward_filter)[i]) Parent::nextIn(i);
   928 	if (*static_cast<GraphEdge*>(&i)==INVALID) {
   929 	  Parent::firstOut(i, n); 
   930 	  i.backward=true;
   931 	  while (*static_cast<GraphEdge*>(&i)!=INVALID && 
   932 		 !(*backward_filter)[i]) Parent::nextOut(i);
   933 	}
   934       } else {
   935 	Parent::nextOut(i);
   936 	while (*static_cast<GraphEdge*>(&i)!=INVALID && 
   937 	       !(*backward_filter)[i]) Parent::nextOut(i);
   938       }
   939     }
   940 
   941     void nextOut(Edge& i) const { 
   942       if (!(i.backward)) {
   943 	Node n=Parent::source(i);
   944 	Parent::nextOut(i);
   945 	while (*static_cast<GraphEdge*>(&i)!=INVALID && 
   946 	       !(*forward_filter)[i]) Parent::nextOut(i);
   947 	if (*static_cast<GraphEdge*>(&i)==INVALID) {
   948 	  Parent::firstIn(i, n); 
   949 	  i.backward=true;
   950 	  while (*static_cast<GraphEdge*>(&i)!=INVALID && 
   951 		 !(*backward_filter)[i]) Parent::nextIn(i);
   952 	}
   953       } else {
   954 	Parent::nextIn(i);
   955 	while (*static_cast<GraphEdge*>(&i)!=INVALID && 
   956 	       !(*backward_filter)[i]) Parent::nextIn(i);
   957       }
   958     }
   959 
   960     Node source(Edge e) const { 
   961       return ((!e.backward) ? this->graph->source(e) : this->graph->target(e)); }
   962     Node target(Edge e) const { 
   963       return ((!e.backward) ? this->graph->target(e) : this->graph->source(e)); }
   964 
   965     /// Gives back the opposite edge.
   966 
   967     ///\e
   968     ///
   969     Edge opposite(const Edge& e) const { 
   970       Edge f=e;
   971       f.backward=!f.backward;
   972       return f;
   973     }
   974 
   975     ///\e
   976 
   977     /// \warning This is a linear time operation and works only if 
   978     /// \c Graph::EdgeIt is defined.
   979     /// \todo hmm
   980     int edgeNum() const { 
   981       int i=0;
   982       Edge e;
   983       for (first(e); e!=INVALID; next(e)) ++i;
   984       return i; 
   985     }
   986 
   987     bool forward(const Edge& e) const { return !e.backward; }
   988     bool backward(const Edge& e) const { return e.backward; }
   989 
   990     ///\e
   991 
   992     /// \c SubBidirGraphAdaptorBase<..., ..., ...>::EdgeMap contains two 
   993     /// _Graph::EdgeMap one for the forward edges and 
   994     /// one for the backward edges.
   995     template <typename T>
   996     class EdgeMap {
   997       template <typename TT> friend class EdgeMap;
   998       typename _Graph::template EdgeMap<T> forward_map, backward_map; 
   999     public:
  1000       typedef T Value;
  1001       typedef Edge Key;
  1002 
  1003       EdgeMap(const SubBidirGraphAdaptorBase<_Graph, 
  1004 	      ForwardFilterMap, BackwardFilterMap>& g) : 
  1005 	forward_map(*(g.graph)), backward_map(*(g.graph)) { }
  1006 
  1007       EdgeMap(const SubBidirGraphAdaptorBase<_Graph, 
  1008 	      ForwardFilterMap, BackwardFilterMap>& g, T a) : 
  1009 	forward_map(*(g.graph), a), backward_map(*(g.graph), a) { }
  1010       
  1011       void set(Edge e, T a) { 
  1012 	if (!e.backward) 
  1013 	  forward_map.set(e, a); 
  1014 	else 
  1015 	  backward_map.set(e, a); 
  1016       }
  1017 
  1018 //       typename _Graph::template EdgeMap<T>::ConstReference 
  1019 //       operator[](Edge e) const { 
  1020 // 	if (!e.backward) 
  1021 // 	  return forward_map[e]; 
  1022 // 	else 
  1023 // 	  return backward_map[e]; 
  1024 //       }
  1025 
  1026 //      typename _Graph::template EdgeMap<T>::Reference 
  1027       T operator[](Edge e) const { 
  1028 	if (!e.backward) 
  1029 	  return forward_map[e]; 
  1030 	else 
  1031 	  return backward_map[e]; 
  1032       }
  1033 
  1034       void update() { 
  1035 	forward_map.update(); 
  1036 	backward_map.update();
  1037       }
  1038     };
  1039 
  1040   };
  1041 
  1042 
  1043   ///\brief An adaptor for composing a subgraph of a 
  1044   /// bidirected graph made from a directed one. 
  1045   ///\ingroup graph_adaptors
  1046   ///
  1047   /// An adaptor for composing a subgraph of a 
  1048   /// bidirected graph made from a directed one. 
  1049   ///
  1050   ///\warning Graph adaptors are in even more experimental state
  1051   ///than the other
  1052   ///parts of the lib. Use them at you own risk.
  1053   ///
  1054   /// Let \f$ G=(V, A) \f$ be a directed graph and for each directed edge 
  1055   ///\f$ e\in A \f$, let \f$ \bar e \f$ denote the edge obtained by
  1056   /// reversing its orientation. We are given moreover two bool valued 
  1057   /// maps on the edge-set, 
  1058   ///\f$ forward\_filter \f$, and \f$ backward\_filter \f$. 
  1059   /// SubBidirGraphAdaptor implements the graph structure with node-set 
  1060   ///\f$ V \f$ and edge-set 
  1061   ///\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$. 
  1062   /// The purpose of writing + instead of union is because parallel 
  1063   /// edges can arise. (Similarly, antiparallel edges also can arise).
  1064   /// In other words, a subgraph of the bidirected graph obtained, which 
  1065   /// is given by orienting the edges of the original graph in both directions.
  1066   /// As the oppositely directed edges are logically different, 
  1067   /// the maps are able to attach different values for them. 
  1068   ///
  1069   /// An example for such a construction is \c RevGraphAdaptor where the 
  1070   /// forward_filter is everywhere false and the backward_filter is 
  1071   /// everywhere true. We note that for sake of efficiency, 
  1072   /// \c RevGraphAdaptor is implemented in a different way. 
  1073   /// But BidirGraphAdaptor is obtained from 
  1074   /// SubBidirGraphAdaptor by considering everywhere true 
  1075   /// valued maps both for forward_filter and backward_filter. 
  1076   ///
  1077   /// The most important application of SubBidirGraphAdaptor 
  1078   /// is ResGraphAdaptor, which stands for the residual graph in directed 
  1079   /// flow and circulation problems. 
  1080   /// As adaptors usually, the SubBidirGraphAdaptor implements the 
  1081   /// above mentioned graph structure without its physical storage, 
  1082   /// that is the whole stuff is stored in constant memory. 
  1083   template<typename _Graph, 
  1084 	   typename ForwardFilterMap, typename BackwardFilterMap>
  1085   class SubBidirGraphAdaptor : 
  1086     public IterableGraphExtender<
  1087     SubBidirGraphAdaptorBase<_Graph, ForwardFilterMap, BackwardFilterMap> > {
  1088   public:
  1089     typedef _Graph Graph;
  1090     typedef IterableGraphExtender<
  1091       SubBidirGraphAdaptorBase<
  1092       _Graph, ForwardFilterMap, BackwardFilterMap> > Parent;
  1093   protected:
  1094     SubBidirGraphAdaptor() { }
  1095   public:
  1096     SubBidirGraphAdaptor(_Graph& _graph, ForwardFilterMap& _forward_filter, 
  1097 			 BackwardFilterMap& _backward_filter) { 
  1098       setGraph(_graph);
  1099       setForwardFilterMap(_forward_filter);
  1100       setBackwardFilterMap(_backward_filter);
  1101     }
  1102   };
  1103 
  1104 
  1105 
  1106   ///\brief An adaptor for composing bidirected graph from a directed one. 
  1107   ///\ingroup graph_adaptors
  1108   ///
  1109   ///\warning Graph adaptors are in even more experimental state
  1110   ///than the other
  1111   ///parts of the lib. Use them at you own risk.
  1112   ///
  1113   /// An adaptor for composing bidirected graph from a directed one. 
  1114   /// A bidirected graph is composed over the directed one without physical 
  1115   /// storage. As the oppositely directed edges are logically different ones 
  1116   /// the maps are able to attach different values for them.
  1117   template<typename Graph>
  1118   class BidirGraphAdaptor : 
  1119     public SubBidirGraphAdaptor<
  1120     Graph, 
  1121     ConstMap<typename Graph::Edge, bool>, 
  1122     ConstMap<typename Graph::Edge, bool> > {
  1123   public:
  1124     typedef  SubBidirGraphAdaptor<
  1125       Graph, 
  1126       ConstMap<typename Graph::Edge, bool>, 
  1127       ConstMap<typename Graph::Edge, bool> > Parent; 
  1128   protected:
  1129     ConstMap<typename Graph::Edge, bool> cm;
  1130 
  1131     BidirGraphAdaptor() : Parent(), cm(true) { 
  1132       Parent::setForwardFilterMap(cm);
  1133       Parent::setBackwardFilterMap(cm);
  1134     }
  1135   public:
  1136     BidirGraphAdaptor(Graph& _graph) : Parent(), cm(true) { 
  1137       Parent::setGraph(_graph);
  1138       Parent::setForwardFilterMap(cm);
  1139       Parent::setBackwardFilterMap(cm);
  1140     }
  1141 
  1142     int edgeNum() const { 
  1143       return 2*this->graph->edgeNum();
  1144     }
  1145   };
  1146 
  1147 
  1148   template<typename Graph, typename Number,
  1149 	   typename CapacityMap, typename FlowMap>
  1150   class ResForwardFilter {
  1151     //    const Graph* graph;
  1152     const CapacityMap* capacity;
  1153     const FlowMap* flow;
  1154   public:
  1155     ResForwardFilter(/*const Graph& _graph, */
  1156 		     const CapacityMap& _capacity, const FlowMap& _flow) :
  1157       /*graph(&_graph),*/ capacity(&_capacity), flow(&_flow) { }
  1158     ResForwardFilter() : /*graph(0),*/ capacity(0), flow(0) { }
  1159     void setCapacity(const CapacityMap& _capacity) { capacity=&_capacity; }
  1160     void setFlow(const FlowMap& _flow) { flow=&_flow; }
  1161     bool operator[](const typename Graph::Edge& e) const {
  1162       return (Number((*flow)[e]) < Number((*capacity)[e]));
  1163     }
  1164   };
  1165 
  1166   template<typename Graph, typename Number,
  1167 	   typename CapacityMap, typename FlowMap>
  1168   class ResBackwardFilter {
  1169     const CapacityMap* capacity;
  1170     const FlowMap* flow;
  1171   public:
  1172     ResBackwardFilter(/*const Graph& _graph,*/ 
  1173 		      const CapacityMap& _capacity, const FlowMap& _flow) :
  1174       /*graph(&_graph),*/ capacity(&_capacity), flow(&_flow) { }
  1175     ResBackwardFilter() : /*graph(0),*/ capacity(0), flow(0) { }
  1176     void setCapacity(const CapacityMap& _capacity) { capacity=&_capacity; }
  1177     void setFlow(const FlowMap& _flow) { flow=&_flow; }
  1178     bool operator[](const typename Graph::Edge& e) const {
  1179       return (Number(0) < Number((*flow)[e]));
  1180     }
  1181   };
  1182 
  1183   
  1184   ///\brief An adaptor for composing the residual
  1185   ///graph for directed flow and circulation problems.
  1186   ///\ingroup graph_adaptors
  1187   ///
  1188   ///An adaptor for composing the residual graph for
  1189   ///directed flow and circulation problems. 
  1190   ///Let \f$ G=(V, A) \f$ be a directed graph and let \f$ F \f$ be a 
  1191   ///number type. Let moreover 
  1192   ///\f$ f,c:A\to F \f$, be functions on the edge-set. 
  1193   ///In the appications of ResGraphAdaptor, \f$ f \f$ usually stands for a flow 
  1194   ///and \f$ c \f$ for a capacity function.   
  1195   ///Suppose that a graph instange \c g of type 
  1196   ///\c ListGraph implements \f$ G \f$.
  1197   ///\code
  1198   ///  ListGraph g;
  1199   ///\endcode
  1200   ///Then RevGraphAdaptor implements the graph structure with node-set 
  1201   ///\f$ V \f$ and edge-set \f$ A_{forward}\cup A_{backward} \f$, where 
  1202   ///\f$ A_{forward}=\{uv : uv\in A, f(uv)<c(uv)\} \f$ and 
  1203   ///\f$ A_{backward}=\{vu : uv\in A, f(uv)>0\} \f$, 
  1204   ///i.e. the so called residual graph. 
  1205   ///When we take the union \f$ A_{forward}\cup A_{backward} \f$, 
  1206   ///multilicities are counted, i.e. if an edge is in both 
  1207   ///\f$ A_{forward} \f$ and \f$ A_{backward} \f$, then in the adaptor it 
  1208   ///appears twice. 
  1209   ///The following code shows how 
  1210   ///such an instance can be constructed.
  1211   ///\code
  1212   ///typedef ListGraph Graph;
  1213   ///Graph::EdgeMap<int> f(g);
  1214   ///Graph::EdgeMap<int> c(g);
  1215   ///ResGraphAdaptor<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > gw(g);
  1216   ///\endcode
  1217   ///\author Marton Makai
  1218   ///
  1219   template<typename Graph, typename Number, 
  1220 	   typename CapacityMap, typename FlowMap>
  1221   class ResGraphAdaptor : 
  1222     public SubBidirGraphAdaptor< 
  1223     Graph, 
  1224     ResForwardFilter<Graph, Number, CapacityMap, FlowMap>,  
  1225     ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> > {
  1226   public:
  1227     typedef SubBidirGraphAdaptor< 
  1228       Graph, 
  1229       ResForwardFilter<Graph, Number, CapacityMap, FlowMap>,  
  1230       ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> > Parent;
  1231   protected:
  1232     const CapacityMap* capacity;
  1233     FlowMap* flow;
  1234     ResForwardFilter<Graph, Number, CapacityMap, FlowMap> forward_filter;
  1235     ResBackwardFilter<Graph, Number, CapacityMap, FlowMap> backward_filter;
  1236     ResGraphAdaptor() : Parent(), 
  1237  			capacity(0), flow(0) { }
  1238     void setCapacityMap(const CapacityMap& _capacity) {
  1239       capacity=&_capacity;
  1240       forward_filter.setCapacity(_capacity);
  1241       backward_filter.setCapacity(_capacity);
  1242     }
  1243     void setFlowMap(FlowMap& _flow) {
  1244       flow=&_flow;
  1245       forward_filter.setFlow(_flow);
  1246       backward_filter.setFlow(_flow);
  1247     }
  1248   public:
  1249     ResGraphAdaptor(Graph& _graph, const CapacityMap& _capacity, 
  1250 		       FlowMap& _flow) : 
  1251       Parent(), capacity(&_capacity), flow(&_flow), 
  1252       forward_filter(/*_graph,*/ _capacity, _flow), 
  1253       backward_filter(/*_graph,*/ _capacity, _flow) {
  1254       Parent::setGraph(_graph);
  1255       Parent::setForwardFilterMap(forward_filter);
  1256       Parent::setBackwardFilterMap(backward_filter);
  1257     }
  1258 
  1259     typedef typename Parent::Edge Edge;
  1260 
  1261     void augment(const Edge& e, Number a) const {
  1262       if (Parent::forward(e))  
  1263 	flow->set(e, (*flow)[e]+a);
  1264       else  
  1265 	flow->set(e, (*flow)[e]-a);
  1266     }
  1267 
  1268     /// \brief Residual capacity map.
  1269     ///
  1270     /// In generic residual graphs the residual capacity can be obtained 
  1271     /// as a map. 
  1272     class ResCap {
  1273     protected:
  1274       const ResGraphAdaptor<Graph, Number, CapacityMap, FlowMap>* res_graph;
  1275     public:
  1276       typedef Number Value;
  1277       typedef Edge Key;
  1278       ResCap(const ResGraphAdaptor<Graph, Number, CapacityMap, FlowMap>& 
  1279 	     _res_graph) : res_graph(&_res_graph) { }
  1280       Number operator[](const Edge& e) const { 
  1281 	if (res_graph->forward(e)) 
  1282 	  return (*(res_graph->capacity))[e]-(*(res_graph->flow))[e]; 
  1283 	else 
  1284 	  return (*(res_graph->flow))[e]; 
  1285       }
  1286     };
  1287 
  1288     //    KEEP_MAPS(Parent, ResGraphAdaptor);
  1289   };
  1290 
  1291 
  1292 
  1293   template <typename _Graph, typename FirstOutEdgesMap>
  1294   class ErasingFirstGraphAdaptorBase : public GraphAdaptorBase<_Graph> {
  1295   public:
  1296     typedef _Graph Graph;
  1297     typedef GraphAdaptorBase<_Graph> Parent;
  1298   protected:
  1299     FirstOutEdgesMap* first_out_edges;
  1300     ErasingFirstGraphAdaptorBase() : Parent(), 
  1301 				     first_out_edges(0) { }
  1302 
  1303     void setFirstOutEdgesMap(FirstOutEdgesMap& _first_out_edges) {
  1304       first_out_edges=&_first_out_edges;
  1305     }
  1306 
  1307   public:
  1308 
  1309     typedef typename Parent::Node Node;
  1310     typedef typename Parent::Edge Edge;
  1311 
  1312     void firstOut(Edge& i, const Node& n) const { 
  1313       i=(*first_out_edges)[n];
  1314     }
  1315 
  1316     void erase(const Edge& e) const {
  1317       Node n=source(e);
  1318       Edge f=e;
  1319       Parent::nextOut(f);
  1320       first_out_edges->set(n, f);
  1321     }    
  1322   };
  1323 
  1324 
  1325   ///\brief For blocking flows.
  1326   ///\ingroup graph_adaptors
  1327   ///
  1328   ///\warning Graph adaptors are in even more
  1329   ///experimental state than the other
  1330   ///parts of the lib. Use them at you own risk.
  1331   ///
  1332   ///This graph adaptor is used for on-the-fly 
  1333   ///Dinits blocking flow computations.
  1334   ///For each node, an out-edge is stored which is used when the 
  1335   ///\code
  1336   ///OutEdgeIt& first(OutEdgeIt&, const Node&)
  1337   ///\endcode
  1338   ///is called. 
  1339   ///
  1340   ///\author Marton Makai
  1341   ///
  1342   template <typename _Graph, typename FirstOutEdgesMap>
  1343   class ErasingFirstGraphAdaptor : 
  1344     public IterableGraphExtender<
  1345     ErasingFirstGraphAdaptorBase<_Graph, FirstOutEdgesMap> > {
  1346   public:
  1347     typedef _Graph Graph;
  1348     typedef IterableGraphExtender<
  1349       ErasingFirstGraphAdaptorBase<_Graph, FirstOutEdgesMap> > Parent;
  1350     ErasingFirstGraphAdaptor(Graph& _graph, 
  1351 			     FirstOutEdgesMap& _first_out_edges) { 
  1352       setGraph(_graph);
  1353       setFirstOutEdgesMap(_first_out_edges);
  1354     } 
  1355 
  1356   };
  1357 
  1358   template <typename _Graph>
  1359   class SplitGraphAdaptorBase 
  1360     : public GraphAdaptorBase<_Graph> {
  1361   public:
  1362     typedef GraphAdaptorBase<_Graph> Parent;
  1363 
  1364     class Node;
  1365     class Edge;
  1366     template <typename T> class NodeMap;
  1367     template <typename T> class EdgeMap;
  1368     
  1369 
  1370     class Node : public Parent::Node {
  1371       friend class SplitGraphAdaptorBase;
  1372       template <typename T> friend class NodeMap;
  1373       typedef typename Parent::Node NodeParent;
  1374     private:
  1375 
  1376       bool entry;
  1377       Node(typename Parent::Node _node, bool _entry)
  1378 	: Parent::Node(_node), entry(_entry) {}
  1379       
  1380     public:
  1381       Node() {}
  1382       Node(Invalid) : NodeParent(INVALID), entry(true) {}
  1383 
  1384       bool operator==(const Node& node) const {
  1385 	return NodeParent::operator==(node) && entry == node.entry;
  1386       }
  1387       
  1388       bool operator!=(const Node& node) const {
  1389 	return !(*this == node);
  1390       }
  1391       
  1392       bool operator<(const Node& node) const {
  1393 	return NodeParent::operator<(node) || 
  1394 	  (NodeParent::operator==(node) && entry < node.entry);
  1395       }
  1396     };
  1397 
  1398     /// \todo May we want VARIANT/union type
  1399     class Edge : public Parent::Edge {
  1400       friend class SplitGraphAdaptorBase;
  1401       template <typename T> friend class EdgeMap;
  1402     private:
  1403       typedef typename Parent::Edge EdgeParent;
  1404       typedef typename Parent::Node NodeParent;
  1405       NodeParent bind;
  1406 
  1407       Edge(const EdgeParent& edge, const NodeParent& node)
  1408 	: EdgeParent(edge), bind(node) {}
  1409     public:
  1410       Edge() {}
  1411       Edge(Invalid) : EdgeParent(INVALID), bind(INVALID) {}
  1412 
  1413       bool operator==(const Edge& edge) const {
  1414 	return EdgeParent::operator==(edge) && bind == edge.bind;
  1415       }
  1416       
  1417       bool operator!=(const Edge& edge) const {
  1418 	return !(*this == edge);
  1419       }
  1420       
  1421       bool operator<(const Edge& edge) const {
  1422 	return EdgeParent::operator<(edge) || 
  1423 	  (EdgeParent::operator==(edge) && bind < edge.bind);
  1424       }
  1425     };
  1426 
  1427     void first(Node& node) const {
  1428       Parent::first(node);
  1429       node.entry = true;
  1430     } 
  1431 
  1432     void next(Node& node) const {
  1433       if (node.entry) {
  1434 	node.entry = false;
  1435       } else {
  1436 	node.entry = true;
  1437 	Parent::next(node);
  1438       }
  1439     }
  1440 
  1441     void first(Edge& edge) const {
  1442       Parent::first(edge);
  1443       if ((typename Parent::Edge&)edge == INVALID) {
  1444 	Parent::first(edge.bind);
  1445       } else {
  1446 	edge.bind = INVALID;
  1447       }
  1448     }
  1449 
  1450     void next(Edge& edge) const {
  1451       if ((typename Parent::Edge&)edge != INVALID) {
  1452 	Parent::next(edge);
  1453 	if ((typename Parent::Edge&)edge == INVALID) {
  1454 	  Parent::first(edge.bind);
  1455 	}
  1456       } else {
  1457 	Parent::next(edge.bind);
  1458       }      
  1459     }
  1460 
  1461     void firstIn(Edge& edge, const Node& node) const {
  1462       if (node.entry) {
  1463 	Parent::firstIn(edge, node);
  1464 	edge.bind = INVALID;
  1465       } else {
  1466 	(typename Parent::Edge&)edge = INVALID;
  1467 	edge.bind = node;
  1468       }
  1469     }
  1470 
  1471     void nextIn(Edge& edge) const {
  1472       if ((typename Parent::Edge&)edge != INVALID) {
  1473 	Parent::nextIn(edge);
  1474       } else {
  1475 	edge.bind = INVALID;
  1476       }      
  1477     }
  1478 
  1479     void firstOut(Edge& edge, const Node& node) const {
  1480       if (!node.entry) {
  1481 	Parent::firstOut(edge, node);
  1482 	edge.bind = INVALID;
  1483       } else {
  1484 	(typename Parent::Edge&)edge = INVALID;
  1485 	edge.bind = node;
  1486       }
  1487     }
  1488 
  1489     void nextOut(Edge& edge) const {
  1490       if ((typename Parent::Edge&)edge != INVALID) {
  1491 	Parent::nextOut(edge);
  1492       } else {
  1493 	edge.bind = INVALID;
  1494       }
  1495     }
  1496 
  1497     Node source(const Edge& edge) const {
  1498       if ((typename Parent::Edge&)edge != INVALID) {
  1499 	return Node(Parent::source(edge), false);
  1500       } else {
  1501 	return Node(edge.bind, true);
  1502       }
  1503     }
  1504 
  1505     Node target(const Edge& edge) const {
  1506       if ((typename Parent::Edge&)edge != INVALID) {
  1507 	return Node(Parent::target(edge), true);
  1508       } else {
  1509 	return Node(edge.bind, false);
  1510       }
  1511     }
  1512 
  1513     static bool entryNode(const Node& node) {
  1514       return node.entry;
  1515     }
  1516 
  1517     static bool exitNode(const Node& node) {
  1518       return !node.entry;
  1519     }
  1520 
  1521     static Node getEntry(const typename Parent::Node& node) {
  1522       return Node(node, true);
  1523     }
  1524 
  1525     static Node getExit(const typename Parent::Node& node) {
  1526       return Node(node, false);
  1527     }
  1528 
  1529     static bool originalEdge(const Edge& edge) {
  1530       return (typename Parent::Edge&)edge != INVALID;
  1531     }
  1532 
  1533     static bool bindingEdge(const Edge& edge) {
  1534       return edge.bind != INVALID;
  1535     }
  1536 
  1537     static Node getBindedNode(const Edge& edge) {
  1538       return edge.bind;
  1539     }
  1540 
  1541     int nodeNum() const {
  1542       return Parent::nodeNum() * 2;
  1543     }
  1544 
  1545     typedef CompileTimeAnd<typename Parent::NodeNumTag, 
  1546     			   typename Parent::EdgeNumTag> EdgeNumTag;
  1547     
  1548     int edgeNum() const {
  1549       return Parent::edgeNum() + Parent::nodeNum();
  1550     }
  1551 
  1552     Edge findEdge(const Node& source, const Node& target, 
  1553 		  const Edge& prev = INVALID) const {
  1554       if (exitNode(source) && entryNode(target)) {
  1555 	return Parent::findEdge(source, target, prev);
  1556       } else {
  1557 	if (prev == INVALID && entryNode(source) && exitNode(target) && 
  1558 	    (typename Parent::Node&)source == (typename Parent::Node&)target) {
  1559 	  return Edge(INVALID, source);
  1560 	} else {
  1561 	  return INVALID;
  1562 	}
  1563       }
  1564     }
  1565     
  1566     template <typename T>
  1567     class NodeMap : public MapBase<Node, T> {
  1568       typedef typename Parent::template NodeMap<T> NodeImpl;
  1569     public:
  1570       NodeMap(const SplitGraphAdaptorBase& _graph) 
  1571 	: entry(_graph), exit(_graph) {}
  1572       NodeMap(const SplitGraphAdaptorBase& _graph, const T& t) 
  1573 	: entry(_graph, t), exit(_graph, t) {}
  1574       
  1575       void set(const Node& key, const T& val) {
  1576 	if (key.entry) { entry.set(key, val); }
  1577 	else {exit.set(key, val); }
  1578       }
  1579       
  1580       typename MapTraits<NodeImpl>::ReturnValue 
  1581       operator[](const Node& key) {
  1582 	if (key.entry) { return entry[key]; }
  1583 	else { return exit[key]; }
  1584       }
  1585 
  1586       typename MapTraits<NodeImpl>::ConstReturnValue
  1587       operator[](const Node& key) const {
  1588 	if (key.entry) { return entry[key]; }
  1589 	else { return exit[key]; }
  1590       }
  1591 
  1592     private:
  1593       NodeImpl entry, exit;
  1594     };
  1595 
  1596     template <typename T>
  1597     class EdgeMap : public MapBase<Edge, T> {
  1598       typedef typename Parent::template NodeMap<T> NodeImpl;
  1599       typedef typename Parent::template EdgeMap<T> EdgeImpl;
  1600     public:
  1601       EdgeMap(const SplitGraphAdaptorBase& _graph) 
  1602 	: bind(_graph), orig(_graph) {}
  1603       EdgeMap(const SplitGraphAdaptorBase& _graph, const T& t) 
  1604 	: bind(_graph, t), orig(_graph, t) {}
  1605       
  1606       void set(const Edge& key, const T& val) {
  1607 	if ((typename Parent::Edge&)key != INVALID) { orig.set(key, val); }
  1608 	else {bind.set(key.bind, val); }
  1609       }
  1610       
  1611       typename MapTraits<EdgeImpl>::ReturnValue
  1612       operator[](const Edge& key) {
  1613 	if ((typename Parent::Edge&)key != INVALID) { return orig[key]; }
  1614 	else {return bind[key.bind]; }
  1615       }
  1616 
  1617       typename MapTraits<EdgeImpl>::ConstReturnValue
  1618       operator[](const Edge& key) const {
  1619 	if ((typename Parent::Edge&)key != INVALID) { return orig[key]; }
  1620 	else {return bind[key.bind]; }
  1621       }
  1622 
  1623     private:
  1624       typename Parent::template NodeMap<T> bind;
  1625       typename Parent::template EdgeMap<T> orig;
  1626     };
  1627 
  1628     template <typename EntryMap, typename ExitMap>
  1629     class CombinedNodeMap : public MapBase<Node, typename EntryMap::Value> {
  1630     public:
  1631       typedef MapBase<Node, typename EntryMap::Value> Parent;
  1632 
  1633       typedef typename Parent::Key Key;
  1634       typedef typename Parent::Value Value;
  1635 
  1636       CombinedNodeMap(EntryMap& _entryMap, ExitMap& _exitMap) 
  1637 	: entryMap(_entryMap), exitMap(_exitMap) {}
  1638 
  1639       Value& operator[](const Key& key) {
  1640 	if (key.entry) {
  1641 	  return entryMap[key];
  1642 	} else {
  1643 	  return exitMap[key];
  1644 	}
  1645       }
  1646 
  1647       Value operator[](const Key& key) const {
  1648 	if (key.entry) {
  1649 	  return entryMap[key];
  1650 	} else {
  1651 	  return exitMap[key];
  1652 	}
  1653       }
  1654 
  1655       void set(const Key& key, const Value& value) {
  1656 	if (key.entry) {
  1657 	  entryMap.set(key, value);
  1658 	} else {
  1659 	  exitMap.set(key, value);
  1660 	}
  1661       }
  1662       
  1663     private:
  1664       
  1665       EntryMap& entryMap;
  1666       ExitMap& exitMap;
  1667       
  1668     };
  1669 
  1670     template <typename EdgeMap, typename NodeMap>
  1671     class CombinedEdgeMap : public MapBase<Edge, typename EdgeMap::Value> {
  1672     public:
  1673       typedef MapBase<Edge, typename EdgeMap::Value> Parent;
  1674 
  1675       typedef typename Parent::Key Key;
  1676       typedef typename Parent::Value Value;
  1677 
  1678       CombinedEdgeMap(EdgeMap& _edgeMap, NodeMap& _nodeMap) 
  1679 	: edgeMap(_edgeMap), nodeMap(_nodeMap) {}
  1680 
  1681       void set(const Edge& edge, const Value& val) {
  1682 	if (SplitGraphAdaptorBase::originalEdge(edge)) {
  1683 	  edgeMap.set(edge, val);
  1684 	} else {
  1685 	  nodeMap.set(SplitGraphAdaptorBase::bindedNode(edge), val);
  1686 	}
  1687       }
  1688 
  1689       Value operator[](const Key& edge) const {
  1690 	if (SplitGraphAdaptorBase::originalEdge(edge)) {
  1691 	  return edgeMap[edge];
  1692 	} else {
  1693 	  return nodeMap[SplitGraphAdaptorBase::bindedNode(edge)];
  1694 	}
  1695       }      
  1696 
  1697       Value& operator[](const Key& edge) {
  1698 	if (SplitGraphAdaptorBase::originalEdge(edge)) {
  1699 	  return edgeMap[edge];
  1700 	} else {
  1701 	  return nodeMap[SplitGraphAdaptorBase::bindedNode(edge)];
  1702 	}
  1703       }      
  1704       
  1705     private:
  1706       EdgeMap& edgeMap;
  1707       NodeMap& nodeMap;
  1708     };
  1709 
  1710   };
  1711 
  1712   template <typename _Graph>
  1713   class SplitGraphAdaptor 
  1714     : public IterableGraphExtender<SplitGraphAdaptorBase<_Graph> > {
  1715   public:
  1716     typedef IterableGraphExtender<SplitGraphAdaptorBase<_Graph> > Parent;
  1717 
  1718     SplitGraphAdaptor(_Graph& graph) {
  1719       Parent::setGraph(graph);
  1720     }
  1721 
  1722 
  1723   };
  1724 
  1725 } //namespace lemon
  1726 
  1727 #endif //LEMON_GRAPH_ADAPTOR_H
  1728