src/work/marci/experiment/edmonds_karp.h
author deba
Wed, 08 Sep 2004 12:06:45 +0000 (2004-09-08)
changeset 822 88226d9fe821
child 921 818510fa3d99
permissions -rw-r--r--
The MapFactories have been removed from the code because
if we use macros then they increases only the complexity.

The pair iterators of the maps are separeted from the maps.

Some macros and comments has been changed.
     1 // -*- c++ -*-
     2 #ifndef HUGO_EDMONDS_KARP_H
     3 #define HUGO_EDMONDS_KARP_H
     4 
     5 #include <algorithm>
     6 #include <list>
     7 #include <iterator>
     8 
     9 #include <bfs_iterator.h>
    10 #include <invalid.h>
    11 
    12 namespace hugo {
    13 
    14   template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
    15   class ResGraph {
    16   public:
    17     typedef typename Graph::Node Node;
    18     typedef typename Graph::NodeIt NodeIt;
    19   private:
    20     typedef typename Graph::SymEdgeIt OldSymEdgeIt;
    21     const Graph& G;
    22     FlowMap& flow;
    23     const CapacityMap& capacity;
    24   public:
    25     ResGraph(const Graph& _G, FlowMap& _flow, 
    26 	     const CapacityMap& _capacity) : 
    27       G(_G), flow(_flow), capacity(_capacity) { }
    28 
    29     class Edge; 
    30     class OutEdgeIt; 
    31     friend class Edge; 
    32     friend class OutEdgeIt; 
    33 
    34     class Edge {
    35       friend class ResGraph<Graph, Number, FlowMap, CapacityMap>;
    36     protected:
    37       const ResGraph<Graph, Number, FlowMap, CapacityMap>* resG;
    38       OldSymEdgeIt sym;
    39     public:
    40       Edge() { } 
    41       //Edge(const Edge& e) : resG(e.resG), sym(e.sym) { }
    42       Number free() const { 
    43 	if (resG->G.aNode(sym)==resG->G.tail(sym)) { 
    44 	  return (resG->capacity.get(sym)-resG->flow.get(sym)); 
    45 	} else { 
    46 	  return (resG->flow.get(sym)); 
    47 	}
    48       }
    49       bool valid() const { return sym.valid(); }
    50       void augment(Number a) const {
    51 	if (resG->G.aNode(sym)==resG->G.tail(sym)) { 
    52 	  resG->flow.set(sym, resG->flow.get(sym)+a);
    53 	  //resG->flow[sym]+=a;
    54 	} else { 
    55 	  resG->flow.set(sym, resG->flow.get(sym)-a);
    56 	  //resG->flow[sym]-=a;
    57 	}
    58       }
    59     };
    60 
    61     class OutEdgeIt : public Edge {
    62       friend class ResGraph<Graph, Number, FlowMap, CapacityMap>;
    63     public:
    64       OutEdgeIt() { }
    65       //OutEdgeIt(const OutEdgeIt& e) { resG=e.resG; sym=e.sym; }
    66     private:
    67       OutEdgeIt(const ResGraph<Graph, Number, FlowMap, CapacityMap>& _resG, Node v) { 
    68       	resG=&_resG;
    69 	sym=resG->G.template first<OldSymEdgeIt>(v);
    70 	while( sym.valid() && !(free()>0) ) { ++sym; }
    71       }
    72     public:
    73       OutEdgeIt& operator++() { 
    74 	++sym; 
    75 	while( sym.valid() && !(free()>0) ) { ++sym; }
    76 	return *this; 
    77       }
    78     };
    79 
    80     void /*getF*/first(OutEdgeIt& e, Node v) const { 
    81       e=OutEdgeIt(*this, v); 
    82     }
    83     void /*getF*/first(NodeIt& v) const { G./*getF*/first(v); }
    84     
    85     template< typename It >
    86     It first() const { 
    87       It e;      
    88       /*getF*/first(e);
    89       return e; 
    90     }
    91 
    92     template< typename It >
    93     It first(Node v) const { 
    94       It e;
    95       /*getF*/first(e, v);
    96       return e; 
    97     }
    98 
    99     Node tail(Edge e) const { return G.aNode(e.sym); }
   100     Node head(Edge e) const { return G.bNode(e.sym); }
   101 
   102     Node aNode(OutEdgeIt e) const { return G.aNode(e.sym); }
   103     Node bNode(OutEdgeIt e) const { return G.bNode(e.sym); }
   104 
   105     int id(Node v) const { return G.id(v); }
   106 
   107     template <typename S>
   108     class NodeMap {
   109       typename Graph::NodeMap<S> node_map; 
   110     public:
   111       NodeMap(const ResGraph<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(_G.G) { }
   112       NodeMap(const ResGraph<Graph, Number, FlowMap, CapacityMap>& _G, S a) : node_map(_G.G, a) { }
   113       void set(Node nit, S a) { node_map.set(nit, a); }
   114       S get(Node nit) const { return node_map.get(nit); }
   115       S& operator[](Node nit) { return node_map[nit]; } 
   116       const S& operator[](Node nit) const { return node_map[nit]; } 
   117     };
   118 
   119   };
   120 
   121 
   122   template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
   123   class ResGraph2 {
   124   public:
   125     typedef typename Graph::Node Node;
   126     typedef typename Graph::NodeIt NodeIt;
   127   private:
   128     //typedef typename Graph::SymEdgeIt OldSymEdgeIt;
   129     typedef typename Graph::OutEdgeIt OldOutEdgeIt;
   130     typedef typename Graph::InEdgeIt OldInEdgeIt;
   131     
   132     const Graph& G;
   133     FlowMap& flow;
   134     const CapacityMap& capacity;
   135   public:
   136     ResGraph2(const Graph& _G, FlowMap& _flow, 
   137 	     const CapacityMap& _capacity) : 
   138       G(_G), flow(_flow), capacity(_capacity) { }
   139 
   140     class Edge; 
   141     class OutEdgeIt; 
   142     friend class Edge; 
   143     friend class OutEdgeIt; 
   144 
   145     class Edge {
   146       friend class ResGraph2<Graph, Number, FlowMap, CapacityMap>;
   147     protected:
   148       const ResGraph2<Graph, Number, FlowMap, CapacityMap>* resG;
   149       //OldSymEdgeIt sym;
   150       OldOutEdgeIt out;
   151       OldInEdgeIt in;
   152       bool out_or_in; //true, iff out
   153     public:
   154       Edge() : out_or_in(true) { } 
   155       Number free() const { 
   156 	if (out_or_in) { 
   157 	  return (resG->capacity.get(out)-resG->flow.get(out)); 
   158 	} else { 
   159 	  return (resG->flow.get(in)); 
   160 	}
   161       }
   162       bool valid() const { 
   163 	return out_or_in && out.valid() || in.valid(); }
   164       void augment(Number a) const {
   165 	if (out_or_in) { 
   166 	  resG->flow.set(out, resG->flow.get(out)+a);
   167 	} else { 
   168 	  resG->flow.set(in, resG->flow.get(in)-a);
   169 	}
   170       }
   171     };
   172 
   173     class OutEdgeIt : public Edge {
   174       friend class ResGraph2<Graph, Number, FlowMap, CapacityMap>;
   175     public:
   176       OutEdgeIt() { }
   177     private:
   178       OutEdgeIt(const ResGraph2<Graph, Number, FlowMap, CapacityMap>& _resG, Node v) { 
   179       	resG=&_resG;
   180 	out=resG->G.template first<OldOutEdgeIt>(v);
   181 	while( out.valid() && !(free()>0) ) { ++out; }
   182 	if (!out.valid()) {
   183 	  out_or_in=0;
   184 	  in=resG->G.template first<OldInEdgeIt>(v);
   185 	  while( in.valid() && !(free()>0) ) { ++in; }
   186 	}
   187       }
   188     public:
   189       OutEdgeIt& operator++() { 
   190 	if (out_or_in) {
   191 	  Node v=resG->G.aNode(out);
   192 	  ++out;
   193 	  while( out.valid() && !(free()>0) ) { ++out; }
   194 	  if (!out.valid()) {
   195 	    out_or_in=0;
   196 	    in=resG->G.template first<OldInEdgeIt>(v);
   197 	    while( in.valid() && !(free()>0) ) { ++in; }
   198 	  }
   199 	} else {
   200 	  ++in;
   201 	  while( in.valid() && !(free()>0) ) { ++in; } 
   202 	}
   203 	return *this; 
   204       }
   205     };
   206 
   207     void /*getF*/first(OutEdgeIt& e, Node v) const { 
   208       e=OutEdgeIt(*this, v); 
   209     }
   210     void /*getF*/first(NodeIt& v) const { G./*getF*/first(v); }
   211     
   212     template< typename It >
   213     It first() const { 
   214       It e;
   215       /*getF*/first(e);
   216       return e; 
   217     }
   218 
   219     template< typename It >
   220     It first(Node v) const { 
   221       It e;
   222       /*getF*/first(e, v);
   223       return e; 
   224     }
   225 
   226     Node tail(Edge e) const { 
   227       return ((e.out_or_in) ? G.aNode(e.out) : G.aNode(e.in)); }
   228     Node head(Edge e) const { 
   229       return ((e.out_or_in) ? G.bNode(e.out) : G.bNode(e.in)); }
   230 
   231     Node aNode(OutEdgeIt e) const { 
   232       return ((e.out_or_in) ? G.aNode(e.out) : G.aNode(e.in)); }
   233     Node bNode(OutEdgeIt e) const { 
   234       return ((e.out_or_in) ? G.bNode(e.out) : G.bNode(e.in)); }
   235 
   236     int id(Node v) const { return G.id(v); }
   237 
   238     template <typename S>
   239     class NodeMap {
   240       typename Graph::NodeMap<S> node_map; 
   241     public:
   242       NodeMap(const ResGraph2<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(_G.G) { }
   243       NodeMap(const ResGraph2<Graph, Number, FlowMap, CapacityMap>& _G, S a) : node_map(_G.G, a) { }
   244       void set(Node nit, S a) { node_map.set(nit, a); }
   245       S get(Node nit) const { return node_map.get(nit); }
   246     };
   247   };
   248 
   249 
   250   template <typename GraphWrapper, typename Number, typename FlowMap, typename CapacityMap>
   251   class MaxFlow {
   252   protected:
   253     typedef GraphWrapper GW;
   254     typedef typename GW::Node Node;
   255     typedef typename GW::Edge Edge;
   256     typedef typename GW::EdgeIt EdgeIt;
   257     typedef typename GW::OutEdgeIt OutEdgeIt;
   258     typedef typename GW::InEdgeIt InEdgeIt;
   259     //const Graph* G;
   260     GW gw;
   261     Node s;
   262     Node t;
   263     FlowMap* flow;
   264     const CapacityMap* capacity;
   265     typedef ResGraphWrapper<GW, Number, FlowMap, CapacityMap > ResGW;
   266     typedef typename ResGW::OutEdgeIt ResGWOutEdgeIt;
   267     typedef typename ResGW::Edge ResGWEdge;
   268   public:
   269 
   270     MaxFlow(const GW& _gw, Node _s, Node _t, FlowMap& _flow, const CapacityMap& _capacity) : 
   271       gw(_gw), s(_s), t(_t), flow(&_flow), capacity(&_capacity) { }
   272 
   273     bool augmentOnShortestPath() {
   274       ResGW res_graph(gw, *flow, *capacity);
   275       bool _augment=false;
   276       
   277       typedef typename ResGW::NodeMap<bool> ReachedMap;
   278       BfsIterator5< ResGW, ReachedMap > bfs(res_graph);
   279       bfs.pushAndSetReached(s);
   280 	
   281       typename ResGW::NodeMap<ResGWEdge> pred(res_graph); 
   282       pred.set(s, INVALID);
   283       
   284       typename ResGW::NodeMap<Number> free(res_graph);
   285 	
   286       //searching for augmenting path
   287       while ( !bfs.finished() ) { 
   288 	ResGWOutEdgeIt e=bfs;
   289 	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
   290 	  Node v=res_graph.tail(e);
   291 	  Node w=res_graph.head(e);
   292 	  pred.set(w, e);
   293 	  if (res_graph.valid(pred.get(v))) {
   294 	    free.set(w, std::min(free.get(v), res_graph.resCap(e)));
   295 	  } else {
   296 	    free.set(w, res_graph.resCap(e)); 
   297 	  }
   298 	  if (res_graph.head(e)==t) { _augment=true; break; }
   299 	}
   300 	
   301 	++bfs;
   302       } //end of searching augmenting path
   303 
   304       if (_augment) {
   305 	Node n=t;
   306 	Number augment_value=free.get(t);
   307 	while (res_graph.valid(pred.get(n))) { 
   308 	  ResGWEdge e=pred.get(n);
   309 	  res_graph.augment(e, augment_value); 
   310 	  n=res_graph.tail(e);
   311 	}
   312       }
   313 
   314       return _augment;
   315     }
   316 
   317     template<typename MapGraphWrapper> 
   318     class DistanceMap {
   319     protected:
   320       MapGraphWrapper gw;
   321       typename MapGraphWrapper::NodeMap<int> dist; 
   322     public:
   323       DistanceMap(MapGraphWrapper& _gw) : gw(_gw), dist(_gw, _gw.nodeNum()) { }
   324       void set(const typename MapGraphWrapper::Node& n, int a) { dist[n]=a; }
   325       int get(const typename MapGraphWrapper::Node& n) const { return dist[n]; }
   326       bool get(const typename MapGraphWrapper::Edge& e) const { 
   327 	return (dist.get(gw.tail(e))<dist.get(gw.head(e))); 
   328       }
   329     };
   330 
   331     template<typename MutableGraph> bool augmentOnBlockingFlow() {      
   332       typedef MutableGraph MG;
   333       bool _augment=false;
   334 
   335       ResGW res_graph(gw, *flow, *capacity);
   336 
   337       typedef typename ResGW::NodeMap<bool> ReachedMap;
   338       BfsIterator5< ResGW, ReachedMap > bfs(res_graph);
   339 
   340       bfs.pushAndSetReached(s);
   341       //typename ResGW::NodeMap<int> dist(res_graph); //filled up with 0's
   342       DistanceMap<ResGW> dist(res_graph);
   343       while ( !bfs.finished() ) { 
   344 	ResGWOutEdgeIt e=bfs;
   345 	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
   346 	  dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
   347 	}
   348 	++bfs;
   349       } //computing distances from s in the residual graph
   350 
   351       MG F;
   352       typedef SubGraphWrapper<ResGW, DistanceMap<ResGW> > FilterResGW;
   353       FilterResGW filter_res_graph(res_graph, dist);
   354       typename ResGW::NodeMap<typename MG::Node> res_graph_to_F(res_graph);
   355       {
   356 	typename ResGW::NodeIt n;
   357 	for(res_graph.first(n); res_graph.valid(n); res_graph.next(n)) {
   358 	  res_graph_to_F.set(n, F.addNode());
   359 	}
   360       }
   361 
   362       typename MG::Node sF=res_graph_to_F.get(s);
   363       typename MG::Node tF=res_graph_to_F.get(t);
   364       typename MG::EdgeMap<ResGWEdge> original_edge(F);
   365       typename MG::EdgeMap<Number> residual_capacity(F);
   366 
   367       //Making F to the graph containing the edges of the residual graph 
   368       //which are in some shortest paths
   369       {
   370 	typename FilterResGW::EdgeIt e;
   371 	for(filter_res_graph.first(e); filter_res_graph.valid(e); filter_res_graph.next(e)) {
   372 	  //if (dist.get(res_graph.head(e))==dist.get(res_graph.tail(e))+1) {
   373 	  typename MG::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
   374 	  original_edge.update();
   375 	  original_edge.set(f, e);
   376 	  residual_capacity.update();
   377 	  residual_capacity.set(f, res_graph.resCap(e));
   378 	  //} 
   379 	}
   380       }
   381 
   382       bool __augment=true;
   383 
   384       while (__augment) {
   385 	__augment=false;
   386 	//computing blocking flow with dfs
   387 	typedef typename TrivGraphWrapper<MG>::NodeMap<bool> BlockingReachedMap;
   388 	DfsIterator5< TrivGraphWrapper<MG>, BlockingReachedMap > dfs(F);
   389 	typename MG::NodeMap<typename MG::Edge> pred(F);
   390 	pred.set(sF, INVALID);
   391 	//invalid iterators for sources
   392 
   393 	typename MG::NodeMap<Number> free(F);
   394 
   395 	dfs.pushAndSetReached(sF);      
   396 	while (!dfs.finished()) {
   397 	  ++dfs;
   398 	  if (F.valid(/*typename MG::OutEdgeIt*/(dfs))) {
   399 	    if (dfs.isBNodeNewlyReached()) {
   400 	      typename MG::Node v=F.aNode(dfs);
   401 	      typename MG::Node w=F.bNode(dfs);
   402 	      pred.set(w, dfs);
   403 	      if (F.valid(pred.get(v))) {
   404 		free.set(w, std::min(free.get(v), residual_capacity.get(dfs)));
   405 	      } else {
   406 		free.set(w, residual_capacity.get(dfs)); 
   407 	      }
   408 	      if (w==tF) { 
   409 		__augment=true; 
   410 		_augment=true;
   411 		break; 
   412 	      }
   413 	      
   414 	    } else {
   415 	      F.erase(/*typename MG::OutEdgeIt*/(dfs));
   416 	    }
   417 	  } 
   418 	}
   419 
   420 	if (__augment) {
   421 	  typename MG::Node n=tF;
   422 	  Number augment_value=free.get(tF);
   423 	  while (F.valid(pred.get(n))) { 
   424 	    typename MG::Edge e=pred.get(n);
   425 	    res_graph.augment(original_edge.get(e), augment_value); 
   426 	    n=F.tail(e);
   427 	    if (residual_capacity.get(e)==augment_value) 
   428 	      F.erase(e); 
   429 	    else 
   430 	      residual_capacity.set(e, residual_capacity.get(e)-augment_value);
   431 	  }
   432 	}
   433 	
   434       }
   435             
   436       return _augment;
   437     }
   438 
   439     template<typename MutableGraph> bool augmentOnBlockingFlow1() {      
   440       typedef MutableGraph MG;
   441       bool _augment=false;
   442 
   443       ResGW res_graph(gw, *flow, *capacity);
   444 
   445       //bfs for distances on the residual graph
   446       typedef typename ResGW::NodeMap<bool> ReachedMap;
   447       BfsIterator5< ResGW, ReachedMap > bfs(res_graph);
   448       bfs.pushAndSetReached(s);
   449       typename ResGW::NodeMap<int> dist(res_graph); //filled up with 0's
   450 
   451       //F will contain the physical copy of the residual graph
   452       //with the set of edges which are on shortest paths
   453       MG F;
   454       typename ResGW::NodeMap<typename MG::Node> res_graph_to_F(res_graph);
   455       {
   456 	typename ResGW::NodeIt n;
   457 	for(res_graph.first(n); res_graph.valid(n); res_graph.next(n)) {
   458 	  res_graph_to_F.set(n, F.addNode());
   459 	}
   460       }
   461 
   462       typename MG::Node sF=res_graph_to_F.get(s);
   463       typename MG::Node tF=res_graph_to_F.get(t);
   464       typename MG::EdgeMap<ResGWEdge> original_edge(F);
   465       typename MG::EdgeMap<Number> residual_capacity(F);
   466 
   467       while ( !bfs.finished() ) { 
   468 	ResGWOutEdgeIt e=bfs;
   469 	if (res_graph.valid(e)) {
   470 	  if (bfs.isBNodeNewlyReached()) {
   471 	    dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
   472 	    typename MG::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
   473 	    original_edge.update();
   474 	    original_edge.set(f, e);
   475 	    residual_capacity.update();
   476 	    residual_capacity.set(f, res_graph.resCap(e));
   477 	  } else {
   478 	    if (dist.get(res_graph.head(e))==(dist.get(res_graph.tail(e))+1)) {
   479 	      typename MG::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
   480 	      original_edge.update();
   481 	      original_edge.set(f, e);
   482 	      residual_capacity.update();
   483 	      residual_capacity.set(f, res_graph.resCap(e));
   484 	    }
   485 	  }
   486 	}
   487 	++bfs;
   488       } //computing distances from s in the residual graph
   489 
   490       bool __augment=true;
   491 
   492       while (__augment) {
   493 	__augment=false;
   494 	//computing blocking flow with dfs
   495 	typedef typename TrivGraphWrapper<MG>::NodeMap<bool> BlockingReachedMap;
   496 	DfsIterator5< TrivGraphWrapper<MG>, BlockingReachedMap > dfs(F);
   497 	typename MG::NodeMap<typename MG::Edge> pred(F);
   498 	pred.set(sF, INVALID);
   499 	//invalid iterators for sources
   500 
   501 	typename MG::NodeMap<Number> free(F);
   502 
   503 	dfs.pushAndSetReached(sF);      
   504 	while (!dfs.finished()) {
   505 	  ++dfs;
   506 	  if (F.valid(/*typename MG::OutEdgeIt*/(dfs))) {
   507 	    if (dfs.isBNodeNewlyReached()) {
   508 	      typename MG::Node v=F.aNode(dfs);
   509 	      typename MG::Node w=F.bNode(dfs);
   510 	      pred.set(w, dfs);
   511 	      if (F.valid(pred.get(v))) {
   512 		free.set(w, std::min(free.get(v), residual_capacity.get(dfs)));
   513 	      } else {
   514 		free.set(w, residual_capacity.get(dfs)); 
   515 	      }
   516 	      if (w==tF) { 
   517 		__augment=true; 
   518 		_augment=true;
   519 		break; 
   520 	      }
   521 	      
   522 	    } else {
   523 	      F.erase(/*typename MG::OutEdgeIt*/(dfs));
   524 	    }
   525 	  } 
   526 	}
   527 
   528 	if (__augment) {
   529 	  typename MG::Node n=tF;
   530 	  Number augment_value=free.get(tF);
   531 	  while (F.valid(pred.get(n))) { 
   532 	    typename MG::Edge e=pred.get(n);
   533 	    res_graph.augment(original_edge.get(e), augment_value); 
   534 	    n=F.tail(e);
   535 	    if (residual_capacity.get(e)==augment_value) 
   536 	      F.erase(e); 
   537 	    else 
   538 	      residual_capacity.set(e, residual_capacity.get(e)-augment_value);
   539 	  }
   540 	}
   541 	
   542       }
   543             
   544       return _augment;
   545     }
   546 
   547     bool augmentOnBlockingFlow2() {
   548       bool _augment=false;
   549 
   550       ResGW res_graph(gw, *flow, *capacity);
   551 
   552       typedef typename ResGW::NodeMap<bool> ReachedMap;
   553       BfsIterator5< ResGW, ReachedMap > bfs(res_graph);
   554 
   555       bfs.pushAndSetReached(s);
   556       DistanceMap<ResGW> dist(res_graph);
   557       while ( !bfs.finished() ) { 
   558  	ResGWOutEdgeIt e=bfs;
   559  	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
   560  	  dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
   561  	}
   562 	++bfs;
   563       } //computing distances from s in the residual graph
   564 
   565       //Subgraph containing the edges on some shortest paths
   566       typedef SubGraphWrapper<ResGW, DistanceMap<ResGW> > FilterResGW;
   567       FilterResGW filter_res_graph(res_graph, dist);
   568 
   569       //Subgraph, which is able to delete edges which are already 
   570       //met by the dfs
   571       typename FilterResGW::NodeMap<typename FilterResGW::OutEdgeIt> 
   572  	first_out_edges(filter_res_graph);
   573       typename FilterResGW::NodeIt v;
   574       for(filter_res_graph.first(v); filter_res_graph.valid(v); 
   575  	  filter_res_graph.next(v)) 
   576       {
   577  	typename FilterResGW::OutEdgeIt e;
   578  	filter_res_graph.first(e, v);
   579  	first_out_edges.set(v, e);
   580       }
   581       typedef ErasingFirstGraphWrapper<FilterResGW, typename FilterResGW::
   582 	NodeMap<typename FilterResGW::OutEdgeIt> > ErasingResGW;
   583       ErasingResGW erasing_res_graph(filter_res_graph, first_out_edges);
   584 
   585       bool __augment=true;
   586 
   587       while (__augment) {
   588 
   589  	__augment=false;
   590  	//computing blocking flow with dfs
   591 	typedef typename ErasingResGW::NodeMap<bool> BlockingReachedMap;
   592  	DfsIterator5< ErasingResGW, BlockingReachedMap > 
   593  	  dfs(erasing_res_graph);
   594  	typename ErasingResGW::NodeMap<typename ErasingResGW::OutEdgeIt> 
   595  	  pred(erasing_res_graph); 
   596  	pred.set(s, INVALID);
   597  	//invalid iterators for sources
   598 
   599  	typename ErasingResGW::NodeMap<Number> free(erasing_res_graph);
   600 
   601  	dfs.pushAndSetReached(s);
   602  	while (!dfs.finished()) {
   603  	  ++dfs;
   604  	  if (erasing_res_graph.valid(
   605  		/*typename ErasingResGW::OutEdgeIt*/(dfs))) 
   606  	  { 
   607  	    if (dfs.isBNodeNewlyReached()) {
   608 	  
   609  	      typename ErasingResGW::Node v=erasing_res_graph.aNode(dfs);
   610  	      typename ErasingResGW::Node w=erasing_res_graph.bNode(dfs);
   611 
   612  	      pred.set(w, /*typename ErasingResGW::OutEdgeIt*/(dfs));
   613  	      if (erasing_res_graph.valid(pred.get(v))) {
   614  		free.set(w, std::min(free.get(v), res_graph.resCap(dfs)));
   615  	      } else {
   616  		free.set(w, res_graph.resCap(dfs)); 
   617  	      }
   618 	      
   619  	      if (w==t) { 
   620  		__augment=true; 
   621  		_augment=true;
   622  		break; 
   623  	      }
   624 	    } else {
   625 	      erasing_res_graph.erase(dfs);
   626 	    }
   627 	  }
   628 	}	
   629 
   630  	if (__augment) {
   631  	  typename ErasingResGW::Node n=t;
   632  	  Number augment_value=free.get(n);
   633  	  while (erasing_res_graph.valid(pred.get(n))) { 
   634  	    typename ErasingResGW::OutEdgeIt e=pred.get(n);
   635  	    res_graph.augment(e, augment_value);
   636  	    n=erasing_res_graph.tail(e);
   637  	    if (res_graph.resCap(e)==0)
   638  	      erasing_res_graph.erase(e);
   639  	  }
   640  	}
   641       
   642       } //while (__augment) 
   643             
   644       return _augment;
   645     }
   646 
   647 //     bool augmentOnBlockingFlow2() {
   648 //       bool _augment=false;
   649 
   650 //       //typedef ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> EAugGraph;
   651 //       typedef FilterGraphWrapper< ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> > EAugGraph;
   652 //       typedef typename EAugGraph::OutEdgeIt EAugOutEdgeIt;
   653 //       typedef typename EAugGraph::Edge EAugEdge;
   654 
   655 //       EAugGraph res_graph(*G, *flow, *capacity);
   656 
   657 //       //typedef typename EAugGraph::NodeMap<bool> ReachedMap;
   658 //       BfsIterator5< 
   659 // 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>, 
   660 // 	/*typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt,*/ 
   661 // 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<bool> > bfs(res_graph);
   662       
   663 //       bfs.pushAndSetReached(s);
   664 
   665 //       typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::
   666 // 	NodeMap<int>& dist=res_graph.dist;
   667 
   668 //       while ( !bfs.finished() ) {
   669 // 	typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt e=bfs;
   670 // 	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
   671 // 	  dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
   672 // 	}
   673 // 	++bfs;	
   674 //       } //computing distances from s in the residual graph
   675 
   676 //       bool __augment=true;
   677 
   678 //       while (__augment) {
   679 
   680 // 	__augment=false;
   681 // 	//computing blocking flow with dfs
   682 // 	typedef typename EAugGraph::NodeMap<bool> BlockingReachedMap;
   683 // 	DfsIterator5< EAugGraph/*, EAugOutEdgeIt*/, BlockingReachedMap > 
   684 // 	  dfs(res_graph);
   685 // 	typename EAugGraph::NodeMap<EAugEdge> pred(res_graph); 
   686 // 	pred.set(s, EAugEdge(INVALID));
   687 // 	//invalid iterators for sources
   688 
   689 // 	typename EAugGraph::NodeMap<Number> free(res_graph);
   690 
   691 // 	dfs.pushAndSetReached(s);
   692 // 	while (!dfs.finished()) {
   693 // 	  ++dfs;
   694 // 	  if (res_graph.valid(EAugOutEdgeIt(dfs))) { 
   695 // 	    if (dfs.isBNodeNewlyReached()) {
   696 	  
   697 // 	      typename EAugGraph::Node v=res_graph.aNode(dfs);
   698 // 	      typename EAugGraph::Node w=res_graph.bNode(dfs);
   699 
   700 // 	      pred.set(w, EAugOutEdgeIt(dfs));
   701 // 	      if (res_graph.valid(pred.get(v))) {
   702 // 		free.set(w, std::min(free.get(v), res_graph.free(dfs)));
   703 // 	      } else {
   704 // 		free.set(w, res_graph.free(dfs)); 
   705 // 	      }
   706 	      
   707 // 	      if (w==t) { 
   708 // 		__augment=true; 
   709 // 		_augment=true;
   710 // 		break; 
   711 // 	      }
   712 // 	    } else {
   713 // 	      res_graph.erase(dfs);
   714 // 	    }
   715 // 	  } 
   716 
   717 // 	}
   718 
   719 // 	if (__augment) {
   720 // 	  typename EAugGraph::Node n=t;
   721 // 	  Number augment_value=free.get(t);
   722 // 	  while (res_graph.valid(pred.get(n))) { 
   723 // 	    EAugEdge e=pred.get(n);
   724 // 	    res_graph.augment(e, augment_value);
   725 // 	    n=res_graph.tail(e);
   726 // 	    if (res_graph.free(e)==0)
   727 // 	      res_graph.erase(e);
   728 // 	  }
   729 // 	}
   730       
   731 //       }
   732             
   733 //       return _augment;
   734 //     }
   735 
   736     void run() {
   737       //int num_of_augmentations=0;
   738       while (augmentOnShortestPath()) { 
   739 	//while (augmentOnBlockingFlow<MutableGraph>()) { 
   740 	//std::cout << ++num_of_augmentations << " ";
   741 	//std::cout<<std::endl;
   742       } 
   743     }
   744 
   745     template<typename MutableGraph> void run() {
   746       //int num_of_augmentations=0;
   747       //while (augmentOnShortestPath()) { 
   748 	while (augmentOnBlockingFlow<MutableGraph>()) { 
   749 	//std::cout << ++num_of_augmentations << " ";
   750 	//std::cout<<std::endl;
   751       } 
   752     }
   753 
   754     Number flowValue() { 
   755       Number a=0;
   756       OutEdgeIt e;
   757       for(gw.first(e, s); gw.valid(e); gw.next(e)) {
   758 	a+=flow->get(e);
   759       }
   760       return a;
   761     }
   762 
   763   };
   764 
   765 
   766 //   template <typename Graph, typename Number, typename FlowMap, typename CapacityMap>
   767 //   class MaxMatching {
   768 //   public:
   769 //     typedef typename Graph::Node Node;
   770 //     typedef typename Graph::NodeIt NodeIt;
   771 //     typedef typename Graph::Edge Edge;
   772 //     typedef typename Graph::EdgeIt EdgeIt;
   773 //     typedef typename Graph::OutEdgeIt OutEdgeIt;
   774 //     typedef typename Graph::InEdgeIt InEdgeIt;
   775 
   776 //     typedef typename Graph::NodeMap<bool> SMap;
   777 //     typedef typename Graph::NodeMap<bool> TMap;
   778 //   private:
   779 //     const Graph* G;
   780 //     SMap* S;
   781 //     TMap* T;
   782 //     //Node s;
   783 //     //Node t;
   784 //     FlowMap* flow;
   785 //     const CapacityMap* capacity;
   786 //     typedef ResGraphWrapper<Graph, Number, FlowMap, CapacityMap > AugGraph;
   787 //     typedef typename AugGraph::OutEdgeIt AugOutEdgeIt;
   788 //     typedef typename AugGraph::Edge AugEdge;
   789 //     typename Graph::NodeMap<int> used; //0
   790 
   791 //   public:
   792 //     MaxMatching(const Graph& _G, SMap& _S, TMap& _T, FlowMap& _flow, const CapacityMap& _capacity) : 
   793 //       G(&_G), S(&_S), T(&_T), flow(&_flow), capacity(&_capacity), used(_G) { }
   794 //     bool augmentOnShortestPath() {
   795 //       AugGraph res_graph(*G, *flow, *capacity);
   796 //       bool _augment=false;
   797       
   798 //       typedef typename AugGraph::NodeMap<bool> ReachedMap;
   799 //       BfsIterator5< AugGraph, /*AugOutEdgeIt,*/ ReachedMap > bfs(res_graph);
   800 //       typename AugGraph::NodeMap<AugEdge> pred(res_graph); 
   801 //       for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
   802 // 	if ((S->get(s)) && (used.get(s)<1) ) {
   803 // 	  //Number u=0;
   804 // 	  //for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
   805 // 	  //u+=flow->get(e);
   806 // 	  //if (u<1) {
   807 // 	    bfs.pushAndSetReached(s);
   808 // 	    pred.set(s, AugEdge(INVALID));
   809 // 	    //}
   810 // 	}
   811 //       }
   812       
   813 //       typename AugGraph::NodeMap<Number> free(res_graph);
   814 	
   815 //       Node n;
   816 //       //searching for augmenting path
   817 //       while ( !bfs.finished() ) { 
   818 // 	AugOutEdgeIt e=bfs;
   819 // 	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
   820 // 	  Node v=res_graph.tail(e);
   821 // 	  Node w=res_graph.head(e);
   822 // 	  pred.set(w, e);
   823 // 	  if (res_graph.valid(pred.get(v))) {
   824 // 	    free.set(w, std::min(free.get(v), res_graph.free(e)));
   825 // 	  } else {
   826 // 	    free.set(w, res_graph.free(e)); 
   827 // 	  }
   828 // 	  n=res_graph.head(e);
   829 // 	  if (T->get(n) && (used.get(n)<1) ) { 
   830 // 	    //Number u=0;
   831 // 	    //for(InEdgeIt f=G->template first<InEdgeIt>(n); G->valid(f); G->next(f))
   832 // 	    //u+=flow->get(f);
   833 // 	    //if (u<1) {
   834 // 	      _augment=true; 
   835 // 	      break; 
   836 // 	      //}
   837 // 	  }
   838 // 	}
   839 	
   840 // 	++bfs;
   841 //       } //end of searching augmenting path
   842 
   843 //       if (_augment) {
   844 // 	//Node n=t;
   845 // 	used.set(n, 1); //mind2 vegen jav
   846 // 	Number augment_value=free.get(n);
   847 // 	while (res_graph.valid(pred.get(n))) { 
   848 // 	  AugEdge e=pred.get(n);
   849 // 	  res_graph.augment(e, augment_value); 
   850 // 	  n=res_graph.tail(e);
   851 // 	}
   852 // 	used.set(n, 1); //mind2 vegen jav
   853 //       }
   854 
   855 //       return _augment;
   856 //     }
   857 
   858 // //     template<typename MutableGraph> bool augmentOnBlockingFlow() {      
   859 // //       bool _augment=false;
   860 
   861 // //       AugGraph res_graph(*G, *flow, *capacity);
   862 
   863 // //       typedef typename AugGraph::NodeMap<bool> ReachedMap;
   864 // //       BfsIterator4< AugGraph, AugOutEdgeIt, ReachedMap > bfs(res_graph);
   865 
   866 
   867 
   868 
   869 
   870 // //       //typename AugGraph::NodeMap<AugEdge> pred(res_graph); 
   871 // //       for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
   872 // // 	if (S->get(s)) {
   873 // // 	  Number u=0;
   874 // // 	  for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
   875 // // 	    u+=flow->get(e);
   876 // // 	  if (u<1) {
   877 // // 	    bfs.pushAndSetReached(s);
   878 // // 	    //pred.set(s, AugEdge(INVALID));
   879 // // 	  }
   880 // // 	}
   881 // //       }
   882 
   883 
   884 
   885 
   886 // //       //bfs.pushAndSetReached(s);
   887 // //       typename AugGraph::NodeMap<int> dist(res_graph); //filled up with 0's
   888 // //       while ( !bfs.finished() ) { 
   889 // // 	AugOutEdgeIt e=bfs;
   890 // // 	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
   891 // // 	  dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
   892 // // 	}
   893 	
   894 // // 	++bfs;
   895 // //       } //computing distances from s in the residual graph
   896 
   897 // //       MutableGraph F;
   898 // //       typename AugGraph::NodeMap<typename MutableGraph::Node> 
   899 // // 	res_graph_to_F(res_graph);
   900 // //       for(typename AugGraph::NodeIt n=res_graph.template first<typename AugGraph::NodeIt>(); res_graph.valid(n); res_graph.next(n)) {
   901 // // 	res_graph_to_F.set(n, F.addNode());
   902 // //       }
   903       
   904 // //       typename MutableGraph::Node sF=res_graph_to_F.get(s);
   905 // //       typename MutableGraph::Node tF=res_graph_to_F.get(t);
   906 
   907 // //       typename MutableGraph::EdgeMap<AugEdge> original_edge(F);
   908 // //       typename MutableGraph::EdgeMap<Number> residual_capacity(F);
   909 
   910 // //       //Making F to the graph containing the edges of the residual graph 
   911 // //       //which are in some shortest paths
   912 // //       for(typename AugGraph::EdgeIt e=res_graph.template first<typename AugGraph::EdgeIt>(); res_graph.valid(e); res_graph.next(e)) {
   913 // // 	if (dist.get(res_graph.head(e))==dist.get(res_graph.tail(e))+1) {
   914 // // 	  typename MutableGraph::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
   915 // // 	  original_edge.update();
   916 // // 	  original_edge.set(f, e);
   917 // // 	  residual_capacity.update();
   918 // // 	  residual_capacity.set(f, res_graph.free(e));
   919 // // 	} 
   920 // //       }
   921 
   922 // //       bool __augment=true;
   923 
   924 // //       while (__augment) {
   925 // // 	__augment=false;
   926 // // 	//computing blocking flow with dfs
   927 // // 	typedef typename MutableGraph::NodeMap<bool> BlockingReachedMap;
   928 // // 	DfsIterator4< MutableGraph, typename MutableGraph::OutEdgeIt, BlockingReachedMap > dfs(F);
   929 // // 	typename MutableGraph::NodeMap<typename MutableGraph::Edge> pred(F);
   930 // // 	pred.set(sF, typename MutableGraph::Edge(INVALID));
   931 // // 	//invalid iterators for sources
   932 
   933 // // 	typename MutableGraph::NodeMap<Number> free(F);
   934 
   935 // // 	dfs.pushAndSetReached(sF);      
   936 // // 	while (!dfs.finished()) {
   937 // // 	  ++dfs;
   938 // // 	  if (F.valid(typename MutableGraph::OutEdgeIt(dfs))) {
   939 // // 	    if (dfs.isBNodeNewlyReached()) {
   940 // // 	      typename MutableGraph::Node v=F.aNode(dfs);
   941 // // 	      typename MutableGraph::Node w=F.bNode(dfs);
   942 // // 	      pred.set(w, dfs);
   943 // // 	      if (F.valid(pred.get(v))) {
   944 // // 		free.set(w, std::min(free.get(v), residual_capacity.get(dfs)));
   945 // // 	      } else {
   946 // // 		free.set(w, residual_capacity.get(dfs)); 
   947 // // 	      }
   948 // // 	      if (w==tF) { 
   949 // // 		__augment=true; 
   950 // // 		_augment=true;
   951 // // 		break; 
   952 // // 	      }
   953 	      
   954 // // 	    } else {
   955 // // 	      F.erase(typename MutableGraph::OutEdgeIt(dfs));
   956 // // 	    }
   957 // // 	  } 
   958 // // 	}
   959 
   960 // // 	if (__augment) {
   961 // // 	  typename MutableGraph::Node n=tF;
   962 // // 	  Number augment_value=free.get(tF);
   963 // // 	  while (F.valid(pred.get(n))) { 
   964 // // 	    typename MutableGraph::Edge e=pred.get(n);
   965 // // 	    res_graph.augment(original_edge.get(e), augment_value); 
   966 // // 	    n=F.tail(e);
   967 // // 	    if (residual_capacity.get(e)==augment_value) 
   968 // // 	      F.erase(e); 
   969 // // 	    else 
   970 // // 	      residual_capacity.set(e, residual_capacity.get(e)-augment_value);
   971 // // 	  }
   972 // // 	}
   973 	
   974 // //       }
   975             
   976 // //       return _augment;
   977 // //     }
   978 //     bool augmentOnBlockingFlow2() {
   979 //       bool _augment=false;
   980 
   981 //       //typedef ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> EAugGraph;
   982 //       typedef FilterGraphWrapper< ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> > EAugGraph;
   983 //       typedef typename EAugGraph::OutEdgeIt EAugOutEdgeIt;
   984 //       typedef typename EAugGraph::Edge EAugEdge;
   985 
   986 //       EAugGraph res_graph(*G, *flow, *capacity);
   987 
   988 //       //typedef typename EAugGraph::NodeMap<bool> ReachedMap;
   989 //       BfsIterator5< 
   990 // 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>, 
   991 // 	/*typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt,*/ 
   992 // 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<bool> > bfs(res_graph);
   993 
   994 
   995 //       //typename AugGraph::NodeMap<AugEdge> pred(res_graph); 
   996 //       for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
   997 // 	if (S->get(s)) {
   998 // 	  Number u=0;
   999 // 	  for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
  1000 // 	    u+=flow->get(e);
  1001 // 	  if (u<1) {
  1002 // 	    bfs.pushAndSetReached(s);
  1003 // 	    //pred.set(s, AugEdge(INVALID));
  1004 // 	  }
  1005 // 	}
  1006 //       }
  1007 
  1008       
  1009 //       //bfs.pushAndSetReached(s);
  1010 
  1011 //       typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::
  1012 // 	NodeMap<int>& dist=res_graph.dist;
  1013 
  1014 //       while ( !bfs.finished() ) {
  1015 // 	typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt e=bfs;
  1016 // 	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
  1017 // 	  dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
  1018 // 	}
  1019 // 	++bfs;	
  1020 //       } //computing distances from s in the residual graph
  1021 
  1022 //       bool __augment=true;
  1023 
  1024 //       while (__augment) {
  1025 
  1026 // 	__augment=false;
  1027 // 	//computing blocking flow with dfs
  1028 // 	typedef typename EAugGraph::NodeMap<bool> BlockingReachedMap;
  1029 // 	DfsIterator5< EAugGraph/*, EAugOutEdgeIt*/, BlockingReachedMap > 
  1030 // 	  dfs(res_graph);
  1031 // 	typename EAugGraph::NodeMap<EAugEdge> pred(res_graph, INVALID); 
  1032 // 	//pred.set(s, EAugEdge(INVALID));
  1033 // 	//invalid iterators for sources
  1034 
  1035 // 	typename EAugGraph::NodeMap<Number> free(res_graph);
  1036 
  1037 
  1038 // 	//typename AugGraph::NodeMap<AugEdge> pred(res_graph); 
  1039 //       for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
  1040 // 	if (S->get(s)) {
  1041 // 	  Number u=0;
  1042 // 	  for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
  1043 // 	    u+=flow->get(e);
  1044 // 	  if (u<1) {
  1045 // 	    dfs.pushAndSetReached(s);
  1046 // 	    //pred.set(s, AugEdge(INVALID));
  1047 // 	  }
  1048 // 	}
  1049 //       }
  1050 
  1051 
  1052 
  1053 //       //dfs.pushAndSetReached(s);
  1054 //       typename EAugGraph::Node n;
  1055 // 	while (!dfs.finished()) {
  1056 // 	  ++dfs;
  1057 // 	  if (res_graph.valid(EAugOutEdgeIt(dfs))) { 
  1058 // 	    if (dfs.isBNodeNewlyReached()) {
  1059 	  
  1060 // 	      typename EAugGraph::Node v=res_graph.aNode(dfs);
  1061 // 	      typename EAugGraph::Node w=res_graph.bNode(dfs);
  1062 
  1063 // 	      pred.set(w, EAugOutEdgeIt(dfs));
  1064 // 	      if (res_graph.valid(pred.get(v))) {
  1065 // 		free.set(w, std::min(free.get(v), res_graph.free(dfs)));
  1066 // 	      } else {
  1067 // 		free.set(w, res_graph.free(dfs)); 
  1068 // 	      }
  1069 	     
  1070 // 	      n=w;
  1071 // 	      if (T->get(w)) {
  1072 // 		Number u=0;
  1073 // 		for(InEdgeIt f=G->template first<InEdgeIt>(n); G->valid(f); G->next(f))
  1074 // 		  u+=flow->get(f);
  1075 // 		if (u<1) {
  1076 // 		  __augment=true; 
  1077 // 		  _augment=true;
  1078 // 		  break; 
  1079 // 		}
  1080 // 	      }
  1081 // 	    } else {
  1082 // 	      res_graph.erase(dfs);
  1083 // 	    }
  1084 // 	  } 
  1085 
  1086 // 	}
  1087 
  1088 // 	if (__augment) {
  1089 // 	  // typename EAugGraph::Node n=t;
  1090 // 	  Number augment_value=free.get(n);
  1091 // 	  while (res_graph.valid(pred.get(n))) { 
  1092 // 	    EAugEdge e=pred.get(n);
  1093 // 	    res_graph.augment(e, augment_value);
  1094 // 	    n=res_graph.tail(e);
  1095 // 	    if (res_graph.free(e)==0)
  1096 // 	      res_graph.erase(e);
  1097 // 	  }
  1098 // 	}
  1099       
  1100 //       }
  1101             
  1102 //       return _augment;
  1103 //     }
  1104 //     void run() {
  1105 //       //int num_of_augmentations=0;
  1106 //       while (augmentOnShortestPath()) { 
  1107 // 	//while (augmentOnBlockingFlow<MutableGraph>()) { 
  1108 // 	//std::cout << ++num_of_augmentations << " ";
  1109 // 	//std::cout<<std::endl;
  1110 //       } 
  1111 //     }
  1112 // //     template<typename MutableGraph> void run() {
  1113 // //       //int num_of_augmentations=0;
  1114 // //       //while (augmentOnShortestPath()) { 
  1115 // // 	while (augmentOnBlockingFlow<MutableGraph>()) { 
  1116 // // 	//std::cout << ++num_of_augmentations << " ";
  1117 // // 	//std::cout<<std::endl;
  1118 // //       } 
  1119 // //     } 
  1120 //     Number flowValue() { 
  1121 //       Number a=0;
  1122 //       EdgeIt e;
  1123 //       for(G->/*getF*/first(e); G->valid(e); G->next(e)) {
  1124 // 	a+=flow->get(e);
  1125 //       }
  1126 //       return a;
  1127 //     }
  1128 //   };
  1129 
  1130 
  1131 
  1132 
  1133 
  1134   
  1135 // //   template <typename Graph, typename Number, typename FlowMap, typename CapacityMap>
  1136 // //   class MaxFlow2 {
  1137 // //   public:
  1138 // //     typedef typename Graph::Node Node;
  1139 // //     typedef typename Graph::Edge Edge;
  1140 // //     typedef typename Graph::EdgeIt EdgeIt;
  1141 // //     typedef typename Graph::OutEdgeIt OutEdgeIt;
  1142 // //     typedef typename Graph::InEdgeIt InEdgeIt;
  1143 // //   private:
  1144 // //     const Graph& G;
  1145 // //     std::list<Node>& S;
  1146 // //     std::list<Node>& T;
  1147 // //     FlowMap& flow;
  1148 // //     const CapacityMap& capacity;
  1149 // //     typedef ResGraphWrapper<Graph, Number, FlowMap, CapacityMap > AugGraph;
  1150 // //     typedef typename AugGraph::OutEdgeIt AugOutEdgeIt;
  1151 // //     typedef typename AugGraph::Edge AugEdge;
  1152 // //     typename Graph::NodeMap<bool> SMap;
  1153 // //     typename Graph::NodeMap<bool> TMap;
  1154 // //   public:
  1155 // //     MaxFlow2(const Graph& _G, std::list<Node>& _S, std::list<Node>& _T, FlowMap& _flow, const CapacityMap& _capacity) : G(_G), S(_S), T(_T), flow(_flow), capacity(_capacity), SMap(_G), TMap(_G) { 
  1156 // //       for(typename std::list<Node>::const_iterator i=S.begin(); 
  1157 // // 	  i!=S.end(); ++i) { 
  1158 // // 	SMap.set(*i, true); 
  1159 // //       }
  1160 // //       for (typename std::list<Node>::const_iterator i=T.begin(); 
  1161 // // 	   i!=T.end(); ++i) { 
  1162 // // 	TMap.set(*i, true); 
  1163 // //       }
  1164 // //     }
  1165 // //     bool augment() {
  1166 // //       AugGraph res_graph(G, flow, capacity);
  1167 // //       bool _augment=false;
  1168 // //       Node reached_t_node;
  1169       
  1170 // //       typedef typename AugGraph::NodeMap<bool> ReachedMap;
  1171 // //       BfsIterator4< AugGraph, AugOutEdgeIt, ReachedMap > bfs(res_graph);
  1172 // //       for(typename std::list<Node>::const_iterator i=S.begin(); 
  1173 // // 	  i!=S.end(); ++i) {
  1174 // // 	bfs.pushAndSetReached(*i);
  1175 // //       }
  1176 // //       //bfs.pushAndSetReached(s);
  1177 	
  1178 // //       typename AugGraph::NodeMap<AugEdge> pred(res_graph); 
  1179 // //       //filled up with invalid iterators
  1180       
  1181 // //       typename AugGraph::NodeMap<Number> free(res_graph);
  1182 	
  1183 // //       //searching for augmenting path
  1184 // //       while ( !bfs.finished() ) { 
  1185 // // 	AugOutEdgeIt e=/*AugOutEdgeIt*/(bfs);
  1186 // // 	if (e.valid() && bfs.isBNodeNewlyReached()) {
  1187 // // 	  Node v=res_graph.tail(e);
  1188 // // 	  Node w=res_graph.head(e);
  1189 // // 	  pred.set(w, e);
  1190 // // 	  if (pred.get(v).valid()) {
  1191 // // 	    free.set(w, std::min(free.get(v), e.free()));
  1192 // // 	  } else {
  1193 // // 	    free.set(w, e.free()); 
  1194 // // 	  }
  1195 // // 	  if (TMap.get(res_graph.head(e))) { 
  1196 // // 	    _augment=true; 
  1197 // // 	    reached_t_node=res_graph.head(e);
  1198 // // 	    break; 
  1199 // // 	  }
  1200 // // 	}
  1201 	
  1202 // // 	++bfs;
  1203 // //       } //end of searching augmenting path
  1204 
  1205 // //       if (_augment) {
  1206 // // 	Node n=reached_t_node;
  1207 // // 	Number augment_value=free.get(reached_t_node);
  1208 // // 	while (pred.get(n).valid()) { 
  1209 // // 	  AugEdge e=pred.get(n);
  1210 // // 	  e.augment(augment_value); 
  1211 // // 	  n=res_graph.tail(e);
  1212 // // 	}
  1213 // //       }
  1214 
  1215 // //       return _augment;
  1216 // //     }
  1217 // //     void run() {
  1218 // //       while (augment()) { } 
  1219 // //     }
  1220 // //     Number flowValue() { 
  1221 // //       Number a=0;
  1222 // //       for(typename std::list<Node>::const_iterator i=S.begin(); 
  1223 // // 	  i!=S.end(); ++i) { 
  1224 // // 	for(OutEdgeIt e=G.template first<OutEdgeIt>(*i); e.valid(); ++e) {
  1225 // // 	  a+=flow.get(e);
  1226 // // 	}
  1227 // // 	for(InEdgeIt e=G.template first<InEdgeIt>(*i); e.valid(); ++e) {
  1228 // // 	  a-=flow.get(e);
  1229 // // 	}
  1230 // //       }
  1231 // //       return a;
  1232 // //     }
  1233 // //   };
  1234 
  1235 
  1236 } // namespace hugo
  1237 
  1238 #endif //HUGO_EDMONDS_KARP_H