Not ready yet.
     2 #ifndef HUGO_EDMONDS_KARP_H
 
     3 #define HUGO_EDMONDS_KARP_H
 
     9 #include <bfs_iterator_1.h>
 
    11 #include <graph_wrapper_1.h>
 
    15   template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
 
    18     typedef typename Graph::Node Node;
 
    19     typedef typename Graph::NodeIt NodeIt;
 
    21     typedef typename Graph::SymEdgeIt OldSymEdgeIt;
 
    24     const CapacityMap& capacity;
 
    26     ResGraph(const Graph& _G, FlowMap& _flow, 
 
    27 	     const CapacityMap& _capacity) : 
 
    28       G(_G), flow(_flow), capacity(_capacity) { }
 
    33     friend class OutEdgeIt; 
 
    36       friend class ResGraph<Graph, Number, FlowMap, CapacityMap>;
 
    38       const ResGraph<Graph, Number, FlowMap, CapacityMap>* resG;
 
    42       //Edge(const Edge& e) : resG(e.resG), sym(e.sym) { }
 
    44 	if (resG->G.aNode(sym)==resG->G.tail(sym)) { 
 
    45 	  return (resG->capacity.get(sym)-resG->flow.get(sym)); 
 
    47 	  return (resG->flow.get(sym)); 
 
    50       bool valid() const { return sym.valid(); }
 
    51       void augment(Number a) const {
 
    52 	if (resG->G.aNode(sym)==resG->G.tail(sym)) { 
 
    53 	  resG->flow.set(sym, resG->flow.get(sym)+a);
 
    56 	  resG->flow.set(sym, resG->flow.get(sym)-a);
 
    62     class OutEdgeIt : public Edge {
 
    63       friend class ResGraph<Graph, Number, FlowMap, CapacityMap>;
 
    66       //OutEdgeIt(const OutEdgeIt& e) { resG=e.resG; sym=e.sym; }
 
    68       OutEdgeIt(const ResGraph<Graph, Number, FlowMap, CapacityMap>& _resG, Node v) { 
 
    70 	sym=resG->G.template first<OldSymEdgeIt>(v);
 
    71 	while( sym.valid() && !(free()>0) ) { ++sym; }
 
    74       OutEdgeIt& operator++() { 
 
    76 	while( sym.valid() && !(free()>0) ) { ++sym; }
 
    81     void /*getF*/first(OutEdgeIt& e, Node v) const { 
 
    82       e=OutEdgeIt(*this, v); 
 
    84     void /*getF*/first(NodeIt& v) const { G./*getF*/first(v); }
 
    86     template< typename It >
 
    93     template< typename It >
 
    94     It first(Node v) const { 
 
   100     Node tail(Edge e) const { return G.aNode(e.sym); }
 
   101     Node head(Edge e) const { return G.bNode(e.sym); }
 
   103     Node aNode(OutEdgeIt e) const { return G.aNode(e.sym); }
 
   104     Node bNode(OutEdgeIt e) const { return G.bNode(e.sym); }
 
   106     int id(Node v) const { return G.id(v); }
 
   108     template <typename S>
 
   110       typename Graph::NodeMap<S> node_map; 
 
   112       NodeMap(const ResGraph<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(_G.G) { }
 
   113       NodeMap(const ResGraph<Graph, Number, FlowMap, CapacityMap>& _G, S a) : node_map(_G.G, a) { }
 
   114       void set(Node nit, S a) { node_map.set(nit, a); }
 
   115       S get(Node nit) const { return node_map.get(nit); }
 
   116       S& operator[](Node nit) { return node_map[nit]; } 
 
   117       const S& operator[](Node nit) const { return node_map[nit]; } 
 
   123   template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
 
   126     typedef typename Graph::Node Node;
 
   127     typedef typename Graph::NodeIt NodeIt;
 
   129     //typedef typename Graph::SymEdgeIt OldSymEdgeIt;
 
   130     typedef typename Graph::OutEdgeIt OldOutEdgeIt;
 
   131     typedef typename Graph::InEdgeIt OldInEdgeIt;
 
   135     const CapacityMap& capacity;
 
   137     ResGraph2(const Graph& _G, FlowMap& _flow, 
 
   138 	     const CapacityMap& _capacity) : 
 
   139       G(_G), flow(_flow), capacity(_capacity) { }
 
   144     friend class OutEdgeIt; 
 
   147       friend class ResGraph2<Graph, Number, FlowMap, CapacityMap>;
 
   149       const ResGraph2<Graph, Number, FlowMap, CapacityMap>* resG;
 
   153       bool out_or_in; //true, iff out
 
   155       Edge() : out_or_in(true) { } 
 
   156       Number free() const { 
 
   158 	  return (resG->capacity.get(out)-resG->flow.get(out)); 
 
   160 	  return (resG->flow.get(in)); 
 
   164 	return out_or_in && out.valid() || in.valid(); }
 
   165       void augment(Number a) const {
 
   167 	  resG->flow.set(out, resG->flow.get(out)+a);
 
   169 	  resG->flow.set(in, resG->flow.get(in)-a);
 
   174     class OutEdgeIt : public Edge {
 
   175       friend class ResGraph2<Graph, Number, FlowMap, CapacityMap>;
 
   179       OutEdgeIt(const ResGraph2<Graph, Number, FlowMap, CapacityMap>& _resG, Node v) { 
 
   181 	out=resG->G.template first<OldOutEdgeIt>(v);
 
   182 	while( out.valid() && !(free()>0) ) { ++out; }
 
   185 	  in=resG->G.template first<OldInEdgeIt>(v);
 
   186 	  while( in.valid() && !(free()>0) ) { ++in; }
 
   190       OutEdgeIt& operator++() { 
 
   192 	  Node v=resG->G.aNode(out);
 
   194 	  while( out.valid() && !(free()>0) ) { ++out; }
 
   197 	    in=resG->G.template first<OldInEdgeIt>(v);
 
   198 	    while( in.valid() && !(free()>0) ) { ++in; }
 
   202 	  while( in.valid() && !(free()>0) ) { ++in; } 
 
   208     void /*getF*/first(OutEdgeIt& e, Node v) const { 
 
   209       e=OutEdgeIt(*this, v); 
 
   211     void /*getF*/first(NodeIt& v) const { G./*getF*/first(v); }
 
   213     template< typename It >
 
   220     template< typename It >
 
   221     It first(Node v) const { 
 
   227     Node tail(Edge e) const { 
 
   228       return ((e.out_or_in) ? G.aNode(e.out) : G.aNode(e.in)); }
 
   229     Node head(Edge e) const { 
 
   230       return ((e.out_or_in) ? G.bNode(e.out) : G.bNode(e.in)); }
 
   232     Node aNode(OutEdgeIt e) const { 
 
   233       return ((e.out_or_in) ? G.aNode(e.out) : G.aNode(e.in)); }
 
   234     Node bNode(OutEdgeIt e) const { 
 
   235       return ((e.out_or_in) ? G.bNode(e.out) : G.bNode(e.in)); }
 
   237     int id(Node v) const { return G.id(v); }
 
   239     template <typename S>
 
   241       typename Graph::NodeMap<S> node_map; 
 
   243       NodeMap(const ResGraph2<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(_G.G) { }
 
   244       NodeMap(const ResGraph2<Graph, Number, FlowMap, CapacityMap>& _G, S a) : node_map(_G.G, a) { }
 
   245       void set(Node nit, S a) { node_map.set(nit, a); }
 
   246       S get(Node nit) const { return node_map.get(nit); }
 
   251   template <typename Graph, typename Number, typename FlowMap, typename CapacityMap>
 
   254     typedef typename Graph::Node Node;
 
   255     typedef typename Graph::Edge Edge;
 
   256     typedef typename Graph::EdgeIt EdgeIt;
 
   257     typedef typename Graph::OutEdgeIt OutEdgeIt;
 
   258     typedef typename Graph::InEdgeIt InEdgeIt;
 
   263     const CapacityMap* capacity;
 
   264     typedef ResGraphWrapper<const Graph, Number, FlowMap, CapacityMap > ResGW;
 
   265     typedef typename ResGW::OutEdgeIt ResGWOutEdgeIt;
 
   266     typedef typename ResGW::Edge ResGWEdge;
 
   269     MaxFlow(const Graph& _g, Node _s, Node _t, FlowMap& _flow, const CapacityMap& _capacity) : 
 
   270       g(&_g), s(_s), t(_t), flow(&_flow), capacity(&_capacity) { }
 
   272     bool augmentOnShortestPath() {
 
   273       ResGW res_graph(*g, *flow, *capacity);
 
   276       typedef typename ResGW::NodeMap<bool> ReachedMap;
 
   277       BfsIterator5< ResGW, ReachedMap > bfs(res_graph);
 
   278       bfs.pushAndSetReached(s);
 
   280       typename ResGW::NodeMap<ResGWEdge> pred(res_graph); 
 
   281       pred.set(s, INVALID);
 
   283       typename ResGW::NodeMap<Number> free(res_graph);
 
   285       //searching for augmenting path
 
   286       while ( !bfs.finished() ) { 
 
   287 	ResGWOutEdgeIt e=bfs;
 
   288 	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
 
   289 	  Node v=res_graph.tail(e);
 
   290 	  Node w=res_graph.head(e);
 
   292 	  if (res_graph.valid(pred.get(v))) {
 
   293 	    free.set(w, std::min(free.get(v), res_graph.resCap(e)));
 
   295 	    free.set(w, res_graph.resCap(e)); 
 
   297 	  if (res_graph.head(e)==t) { _augment=true; break; }
 
   301       } //end of searching augmenting path
 
   305 	Number augment_value=free.get(t);
 
   306 	while (res_graph.valid(pred.get(n))) { 
 
   307 	  ResGWEdge e=pred.get(n);
 
   308 	  res_graph.augment(e, augment_value); 
 
   316     template<typename MapGraphWrapper> 
 
   319       const MapGraphWrapper* g;
 
   320       typename MapGraphWrapper::NodeMap<int> dist; 
 
   322       DistanceMap(MapGraphWrapper& _g) : g(&_g), dist(*g, g->nodeNum()) { }
 
   323       void set(const typename MapGraphWrapper::Node& n, int a) { dist[n]=a; }
 
   324       int get(const typename MapGraphWrapper::Node& n) const { return dist[n]; }
 
   325       bool get(const typename MapGraphWrapper::Edge& e) const { 
 
   326 	return (dist.get(g->tail(e))<dist.get(g->head(e))); 
 
   330     template<typename MutableGraph> bool augmentOnBlockingFlow() {      
 
   331       typedef MutableGraph MG;
 
   334       ResGW res_graph(*g, *flow, *capacity);
 
   336       typedef typename ResGW::NodeMap<bool> ReachedMap;
 
   337       BfsIterator5< ResGW, ReachedMap > bfs(res_graph);
 
   339       bfs.pushAndSetReached(s);
 
   340       //typename ResGW::NodeMap<int> dist(res_graph); //filled up with 0's
 
   341       DistanceMap<ResGW> dist(res_graph);
 
   342       while ( !bfs.finished() ) { 
 
   343 	ResGWOutEdgeIt e=bfs;
 
   344 	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
 
   345 	  dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
 
   348       } //computing distances from s in the residual graph
 
   351       typedef SubGraphWrapper<ResGW, DistanceMap<ResGW> > FilterResGW;
 
   352       FilterResGW filter_res_graph(res_graph, dist);
 
   353       typename ResGW::NodeMap<typename MG::Node> res_graph_to_F(res_graph);
 
   355 	typename ResGW::NodeIt n;
 
   356 	for(res_graph.first(n); res_graph.valid(n); res_graph.next(n)) {
 
   357 	  res_graph_to_F.set(n, F.addNode());
 
   361       typename MG::Node sF=res_graph_to_F.get(s);
 
   362       typename MG::Node tF=res_graph_to_F.get(t);
 
   363       typename MG::EdgeMap<ResGWEdge> original_edge(F);
 
   364       typename MG::EdgeMap<Number> residual_capacity(F);
 
   366       //Making F to the graph containing the edges of the residual graph 
 
   367       //which are in some shortest paths
 
   369 	typename FilterResGW::EdgeIt e;
 
   370 	for(filter_res_graph.first(e); filter_res_graph.valid(e); filter_res_graph.next(e)) {
 
   371 	  //if (dist.get(res_graph.head(e))==dist.get(res_graph.tail(e))+1) {
 
   372 	  typename MG::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
 
   373 	  original_edge.update();
 
   374 	  original_edge.set(f, e);
 
   375 	  residual_capacity.update();
 
   376 	  residual_capacity.set(f, res_graph.resCap(e));
 
   385 	//computing blocking flow with dfs
 
   386 	typedef typename TrivGraphWrapper<MG>::NodeMap<bool> BlockingReachedMap;
 
   387 	DfsIterator5< TrivGraphWrapper<MG>, BlockingReachedMap > dfs(F);
 
   388 	typename MG::NodeMap<typename MG::Edge> pred(F);
 
   389 	pred.set(sF, INVALID);
 
   390 	//invalid iterators for sources
 
   392 	typename MG::NodeMap<Number> free(F);
 
   394 	dfs.pushAndSetReached(sF);      
 
   395 	while (!dfs.finished()) {
 
   397 	  if (F.valid(/*typename MG::OutEdgeIt*/(dfs))) {
 
   398 	    if (dfs.isBNodeNewlyReached()) {
 
   399 	      typename MG::Node v=F.aNode(dfs);
 
   400 	      typename MG::Node w=F.bNode(dfs);
 
   402 	      if (F.valid(pred.get(v))) {
 
   403 		free.set(w, std::min(free.get(v), residual_capacity.get(dfs)));
 
   405 		free.set(w, residual_capacity.get(dfs)); 
 
   414 	      F.erase(/*typename MG::OutEdgeIt*/(dfs));
 
   420 	  typename MG::Node n=tF;
 
   421 	  Number augment_value=free.get(tF);
 
   422 	  while (F.valid(pred.get(n))) { 
 
   423 	    typename MG::Edge e=pred.get(n);
 
   424 	    res_graph.augment(original_edge.get(e), augment_value); 
 
   426 	    if (residual_capacity.get(e)==augment_value) 
 
   429 	      residual_capacity.set(e, residual_capacity.get(e)-augment_value);
 
   438     template<typename MutableGraph> bool augmentOnBlockingFlow1() {      
 
   439       typedef MutableGraph MG;
 
   442       ResGW res_graph(*g, *flow, *capacity);
 
   444       //bfs for distances on the residual graph
 
   445       typedef typename ResGW::NodeMap<bool> ReachedMap;
 
   446       BfsIterator5< ResGW, ReachedMap > bfs(res_graph);
 
   447       bfs.pushAndSetReached(s);
 
   448       typename ResGW::NodeMap<int> dist(res_graph); //filled up with 0's
 
   450       //F will contain the physical copy of the residual graph
 
   451       //with the set of edges which are on shortest paths
 
   453       typename ResGW::NodeMap<typename MG::Node> res_graph_to_F(res_graph);
 
   455 	typename ResGW::NodeIt n;
 
   456 	for(res_graph.first(n); res_graph.valid(n); res_graph.next(n)) {
 
   457 	  res_graph_to_F.set(n, F.addNode());
 
   461       typename MG::Node sF=res_graph_to_F.get(s);
 
   462       typename MG::Node tF=res_graph_to_F.get(t);
 
   463       typename MG::EdgeMap<ResGWEdge> original_edge(F);
 
   464       typename MG::EdgeMap<Number> residual_capacity(F);
 
   466       while ( !bfs.finished() ) { 
 
   467 	ResGWOutEdgeIt e=bfs;
 
   468 	if (res_graph.valid(e)) {
 
   469 	  if (bfs.isBNodeNewlyReached()) {
 
   470 	    dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
 
   471 	    typename MG::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
 
   472 	    original_edge.update();
 
   473 	    original_edge.set(f, e);
 
   474 	    residual_capacity.update();
 
   475 	    residual_capacity.set(f, res_graph.resCap(e));
 
   477 	    if (dist.get(res_graph.head(e))==(dist.get(res_graph.tail(e))+1)) {
 
   478 	      typename MG::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
 
   479 	      original_edge.update();
 
   480 	      original_edge.set(f, e);
 
   481 	      residual_capacity.update();
 
   482 	      residual_capacity.set(f, res_graph.resCap(e));
 
   487       } //computing distances from s in the residual graph
 
   493 	//computing blocking flow with dfs
 
   494 	typedef typename TrivGraphWrapper<MG>::NodeMap<bool> BlockingReachedMap;
 
   495 	DfsIterator5< TrivGraphWrapper<MG>, BlockingReachedMap > dfs(F);
 
   496 	typename MG::NodeMap<typename MG::Edge> pred(F);
 
   497 	pred.set(sF, INVALID);
 
   498 	//invalid iterators for sources
 
   500 	typename MG::NodeMap<Number> free(F);
 
   502 	dfs.pushAndSetReached(sF);      
 
   503 	while (!dfs.finished()) {
 
   505 	  if (F.valid(/*typename MG::OutEdgeIt*/(dfs))) {
 
   506 	    if (dfs.isBNodeNewlyReached()) {
 
   507 	      typename MG::Node v=F.aNode(dfs);
 
   508 	      typename MG::Node w=F.bNode(dfs);
 
   510 	      if (F.valid(pred.get(v))) {
 
   511 		free.set(w, std::min(free.get(v), residual_capacity.get(dfs)));
 
   513 		free.set(w, residual_capacity.get(dfs)); 
 
   522 	      F.erase(/*typename MG::OutEdgeIt*/(dfs));
 
   528 	  typename MG::Node n=tF;
 
   529 	  Number augment_value=free.get(tF);
 
   530 	  while (F.valid(pred.get(n))) { 
 
   531 	    typename MG::Edge e=pred.get(n);
 
   532 	    res_graph.augment(original_edge.get(e), augment_value); 
 
   534 	    if (residual_capacity.get(e)==augment_value) 
 
   537 	      residual_capacity.set(e, residual_capacity.get(e)-augment_value);
 
   546     bool augmentOnBlockingFlow2() {
 
   549       ResGW res_graph(*g, *flow, *capacity);
 
   551       typedef typename ResGW::NodeMap<bool> ReachedMap;
 
   552       BfsIterator5< ResGW, ReachedMap > bfs(res_graph);
 
   554       bfs.pushAndSetReached(s);
 
   555       DistanceMap<ResGW> dist(res_graph);
 
   556       while ( !bfs.finished() ) { 
 
   557  	ResGWOutEdgeIt e=bfs;
 
   558  	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
 
   559  	  dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
 
   562       } //computing distances from s in the residual graph
 
   564       //Subgraph containing the edges on some shortest paths
 
   565       typedef SubGraphWrapper<ResGW, DistanceMap<ResGW> > FilterResGW;
 
   566       FilterResGW filter_res_graph(res_graph, dist);
 
   568       //Subgraph, which is able to delete edges which are already 
 
   570       typename FilterResGW::NodeMap<typename FilterResGW::OutEdgeIt> 
 
   571  	first_out_edges(filter_res_graph);
 
   572       typename FilterResGW::NodeIt v;
 
   573       for(filter_res_graph.first(v); filter_res_graph.valid(v); 
 
   574  	  filter_res_graph.next(v)) 
 
   576  	typename FilterResGW::OutEdgeIt e;
 
   577  	filter_res_graph.first(e, v);
 
   578  	first_out_edges.set(v, e);
 
   580       typedef ErasingFirstGraphWrapper<FilterResGW, typename FilterResGW::
 
   581 	NodeMap<typename FilterResGW::OutEdgeIt> > ErasingResGW;
 
   582       ErasingResGW erasing_res_graph(filter_res_graph, first_out_edges);
 
   589  	//computing blocking flow with dfs
 
   590 	typedef typename ErasingResGW::NodeMap<bool> BlockingReachedMap;
 
   591  	DfsIterator5< ErasingResGW, BlockingReachedMap > 
 
   592  	  dfs(erasing_res_graph);
 
   593  	typename ErasingResGW::NodeMap<typename ErasingResGW::OutEdgeIt> 
 
   594  	  pred(erasing_res_graph); 
 
   595  	pred.set(s, INVALID);
 
   596  	//invalid iterators for sources
 
   598  	typename ErasingResGW::NodeMap<Number> free(erasing_res_graph);
 
   600  	dfs.pushAndSetReached(s);
 
   601  	while (!dfs.finished()) {
 
   603  	  if (erasing_res_graph.valid(
 
   604  		/*typename ErasingResGW::OutEdgeIt*/(dfs))) 
 
   606  	    if (dfs.isBNodeNewlyReached()) {
 
   608  	      typename ErasingResGW::Node v=erasing_res_graph.aNode(dfs);
 
   609  	      typename ErasingResGW::Node w=erasing_res_graph.bNode(dfs);
 
   611  	      pred.set(w, /*typename ErasingResGW::OutEdgeIt*/(dfs));
 
   612  	      if (erasing_res_graph.valid(pred.get(v))) {
 
   613  		free.set(w, std::min(free.get(v), res_graph.resCap(dfs)));
 
   615  		free.set(w, res_graph.resCap(dfs)); 
 
   624 	      erasing_res_graph.erase(dfs);
 
   630  	  typename ErasingResGW::Node n=t;
 
   631  	  Number augment_value=free.get(n);
 
   632  	  while (erasing_res_graph.valid(pred.get(n))) { 
 
   633  	    typename ErasingResGW::OutEdgeIt e=pred.get(n);
 
   634  	    res_graph.augment(e, augment_value);
 
   635  	    n=erasing_res_graph.tail(e);
 
   636  	    if (res_graph.resCap(e)==0)
 
   637  	      erasing_res_graph.erase(e);
 
   641       } //while (__augment) 
 
   647       //int num_of_augmentations=0;
 
   648       while (augmentOnShortestPath()) { 
 
   649 	//while (augmentOnBlockingFlow<MutableGraph>()) { 
 
   650 	//std::cout << ++num_of_augmentations << " ";
 
   651 	//std::cout<<std::endl;
 
   655     template<typename MutableGraph> void run() {
 
   656       //int num_of_augmentations=0;
 
   657       //while (augmentOnShortestPath()) { 
 
   658 	while (augmentOnBlockingFlow<MutableGraph>()) { 
 
   659 	//std::cout << ++num_of_augmentations << " ";
 
   660 	//std::cout<<std::endl;
 
   667       for(g->first(e, s); g->valid(e); g->next(e)) {
 
   676 //   template <typename Graph, typename Number, typename FlowMap, typename CapacityMap>
 
   677 //   class MaxMatching {
 
   679 //     typedef typename Graph::Node Node;
 
   680 //     typedef typename Graph::NodeIt NodeIt;
 
   681 //     typedef typename Graph::Edge Edge;
 
   682 //     typedef typename Graph::EdgeIt EdgeIt;
 
   683 //     typedef typename Graph::OutEdgeIt OutEdgeIt;
 
   684 //     typedef typename Graph::InEdgeIt InEdgeIt;
 
   686 //     typedef typename Graph::NodeMap<bool> SMap;
 
   687 //     typedef typename Graph::NodeMap<bool> TMap;
 
   695 //     const CapacityMap* capacity;
 
   696 //     typedef ResGraphWrapper<Graph, Number, FlowMap, CapacityMap > AugGraph;
 
   697 //     typedef typename AugGraph::OutEdgeIt AugOutEdgeIt;
 
   698 //     typedef typename AugGraph::Edge AugEdge;
 
   699 //     typename Graph::NodeMap<int> used; //0
 
   702 //     MaxMatching(const Graph& _G, SMap& _S, TMap& _T, FlowMap& _flow, const CapacityMap& _capacity) : 
 
   703 //       G(&_G), S(&_S), T(&_T), flow(&_flow), capacity(&_capacity), used(_G) { }
 
   704 //     bool augmentOnShortestPath() {
 
   705 //       AugGraph res_graph(*G, *flow, *capacity);
 
   706 //       bool _augment=false;
 
   708 //       typedef typename AugGraph::NodeMap<bool> ReachedMap;
 
   709 //       BfsIterator5< AugGraph, /*AugOutEdgeIt,*/ ReachedMap > bfs(res_graph);
 
   710 //       typename AugGraph::NodeMap<AugEdge> pred(res_graph); 
 
   711 //       for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
 
   712 // 	if ((S->get(s)) && (used.get(s)<1) ) {
 
   714 // 	  //for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
 
   715 // 	  //u+=flow->get(e);
 
   717 // 	    bfs.pushAndSetReached(s);
 
   718 // 	    pred.set(s, AugEdge(INVALID));
 
   723 //       typename AugGraph::NodeMap<Number> free(res_graph);
 
   726 //       //searching for augmenting path
 
   727 //       while ( !bfs.finished() ) { 
 
   728 // 	AugOutEdgeIt e=bfs;
 
   729 // 	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
 
   730 // 	  Node v=res_graph.tail(e);
 
   731 // 	  Node w=res_graph.head(e);
 
   733 // 	  if (res_graph.valid(pred.get(v))) {
 
   734 // 	    free.set(w, std::min(free.get(v), res_graph.free(e)));
 
   736 // 	    free.set(w, res_graph.free(e)); 
 
   738 // 	  n=res_graph.head(e);
 
   739 // 	  if (T->get(n) && (used.get(n)<1) ) { 
 
   741 // 	    //for(InEdgeIt f=G->template first<InEdgeIt>(n); G->valid(f); G->next(f))
 
   742 // 	    //u+=flow->get(f);
 
   751 //       } //end of searching augmenting path
 
   755 // 	used.set(n, 1); //mind2 vegen jav
 
   756 // 	Number augment_value=free.get(n);
 
   757 // 	while (res_graph.valid(pred.get(n))) { 
 
   758 // 	  AugEdge e=pred.get(n);
 
   759 // 	  res_graph.augment(e, augment_value); 
 
   760 // 	  n=res_graph.tail(e);
 
   762 // 	used.set(n, 1); //mind2 vegen jav
 
   768 // //     template<typename MutableGraph> bool augmentOnBlockingFlow() {      
 
   769 // //       bool _augment=false;
 
   771 // //       AugGraph res_graph(*G, *flow, *capacity);
 
   773 // //       typedef typename AugGraph::NodeMap<bool> ReachedMap;
 
   774 // //       BfsIterator4< AugGraph, AugOutEdgeIt, ReachedMap > bfs(res_graph);
 
   780 // //       //typename AugGraph::NodeMap<AugEdge> pred(res_graph); 
 
   781 // //       for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
 
   782 // // 	if (S->get(s)) {
 
   784 // // 	  for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
 
   785 // // 	    u+=flow->get(e);
 
   787 // // 	    bfs.pushAndSetReached(s);
 
   788 // // 	    //pred.set(s, AugEdge(INVALID));
 
   796 // //       //bfs.pushAndSetReached(s);
 
   797 // //       typename AugGraph::NodeMap<int> dist(res_graph); //filled up with 0's
 
   798 // //       while ( !bfs.finished() ) { 
 
   799 // // 	AugOutEdgeIt e=bfs;
 
   800 // // 	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
 
   801 // // 	  dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
 
   805 // //       } //computing distances from s in the residual graph
 
   807 // //       MutableGraph F;
 
   808 // //       typename AugGraph::NodeMap<typename MutableGraph::Node> 
 
   809 // // 	res_graph_to_F(res_graph);
 
   810 // //       for(typename AugGraph::NodeIt n=res_graph.template first<typename AugGraph::NodeIt>(); res_graph.valid(n); res_graph.next(n)) {
 
   811 // // 	res_graph_to_F.set(n, F.addNode());
 
   814 // //       typename MutableGraph::Node sF=res_graph_to_F.get(s);
 
   815 // //       typename MutableGraph::Node tF=res_graph_to_F.get(t);
 
   817 // //       typename MutableGraph::EdgeMap<AugEdge> original_edge(F);
 
   818 // //       typename MutableGraph::EdgeMap<Number> residual_capacity(F);
 
   820 // //       //Making F to the graph containing the edges of the residual graph 
 
   821 // //       //which are in some shortest paths
 
   822 // //       for(typename AugGraph::EdgeIt e=res_graph.template first<typename AugGraph::EdgeIt>(); res_graph.valid(e); res_graph.next(e)) {
 
   823 // // 	if (dist.get(res_graph.head(e))==dist.get(res_graph.tail(e))+1) {
 
   824 // // 	  typename MutableGraph::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
 
   825 // // 	  original_edge.update();
 
   826 // // 	  original_edge.set(f, e);
 
   827 // // 	  residual_capacity.update();
 
   828 // // 	  residual_capacity.set(f, res_graph.free(e));
 
   832 // //       bool __augment=true;
 
   834 // //       while (__augment) {
 
   835 // // 	__augment=false;
 
   836 // // 	//computing blocking flow with dfs
 
   837 // // 	typedef typename MutableGraph::NodeMap<bool> BlockingReachedMap;
 
   838 // // 	DfsIterator4< MutableGraph, typename MutableGraph::OutEdgeIt, BlockingReachedMap > dfs(F);
 
   839 // // 	typename MutableGraph::NodeMap<typename MutableGraph::Edge> pred(F);
 
   840 // // 	pred.set(sF, typename MutableGraph::Edge(INVALID));
 
   841 // // 	//invalid iterators for sources
 
   843 // // 	typename MutableGraph::NodeMap<Number> free(F);
 
   845 // // 	dfs.pushAndSetReached(sF);      
 
   846 // // 	while (!dfs.finished()) {
 
   848 // // 	  if (F.valid(typename MutableGraph::OutEdgeIt(dfs))) {
 
   849 // // 	    if (dfs.isBNodeNewlyReached()) {
 
   850 // // 	      typename MutableGraph::Node v=F.aNode(dfs);
 
   851 // // 	      typename MutableGraph::Node w=F.bNode(dfs);
 
   852 // // 	      pred.set(w, dfs);
 
   853 // // 	      if (F.valid(pred.get(v))) {
 
   854 // // 		free.set(w, std::min(free.get(v), residual_capacity.get(dfs)));
 
   856 // // 		free.set(w, residual_capacity.get(dfs)); 
 
   859 // // 		__augment=true; 
 
   865 // // 	      F.erase(typename MutableGraph::OutEdgeIt(dfs));
 
   870 // // 	if (__augment) {
 
   871 // // 	  typename MutableGraph::Node n=tF;
 
   872 // // 	  Number augment_value=free.get(tF);
 
   873 // // 	  while (F.valid(pred.get(n))) { 
 
   874 // // 	    typename MutableGraph::Edge e=pred.get(n);
 
   875 // // 	    res_graph.augment(original_edge.get(e), augment_value); 
 
   877 // // 	    if (residual_capacity.get(e)==augment_value) 
 
   880 // // 	      residual_capacity.set(e, residual_capacity.get(e)-augment_value);
 
   886 // //       return _augment;
 
   888 //     bool augmentOnBlockingFlow2() {
 
   889 //       bool _augment=false;
 
   891 //       //typedef ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> EAugGraph;
 
   892 //       typedef FilterGraphWrapper< ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> > EAugGraph;
 
   893 //       typedef typename EAugGraph::OutEdgeIt EAugOutEdgeIt;
 
   894 //       typedef typename EAugGraph::Edge EAugEdge;
 
   896 //       EAugGraph res_graph(*G, *flow, *capacity);
 
   898 //       //typedef typename EAugGraph::NodeMap<bool> ReachedMap;
 
   900 // 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>, 
 
   901 // 	/*typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt,*/ 
 
   902 // 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<bool> > bfs(res_graph);
 
   905 //       //typename AugGraph::NodeMap<AugEdge> pred(res_graph); 
 
   906 //       for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
 
   909 // 	  for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
 
   912 // 	    bfs.pushAndSetReached(s);
 
   913 // 	    //pred.set(s, AugEdge(INVALID));
 
   919 //       //bfs.pushAndSetReached(s);
 
   921 //       typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::
 
   922 // 	NodeMap<int>& dist=res_graph.dist;
 
   924 //       while ( !bfs.finished() ) {
 
   925 // 	typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt e=bfs;
 
   926 // 	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
 
   927 // 	  dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
 
   930 //       } //computing distances from s in the residual graph
 
   932 //       bool __augment=true;
 
   934 //       while (__augment) {
 
   937 // 	//computing blocking flow with dfs
 
   938 // 	typedef typename EAugGraph::NodeMap<bool> BlockingReachedMap;
 
   939 // 	DfsIterator5< EAugGraph/*, EAugOutEdgeIt*/, BlockingReachedMap > 
 
   941 // 	typename EAugGraph::NodeMap<EAugEdge> pred(res_graph, INVALID); 
 
   942 // 	//pred.set(s, EAugEdge(INVALID));
 
   943 // 	//invalid iterators for sources
 
   945 // 	typename EAugGraph::NodeMap<Number> free(res_graph);
 
   948 // 	//typename AugGraph::NodeMap<AugEdge> pred(res_graph); 
 
   949 //       for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
 
   952 // 	  for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
 
   955 // 	    dfs.pushAndSetReached(s);
 
   956 // 	    //pred.set(s, AugEdge(INVALID));
 
   963 //       //dfs.pushAndSetReached(s);
 
   964 //       typename EAugGraph::Node n;
 
   965 // 	while (!dfs.finished()) {
 
   967 // 	  if (res_graph.valid(EAugOutEdgeIt(dfs))) { 
 
   968 // 	    if (dfs.isBNodeNewlyReached()) {
 
   970 // 	      typename EAugGraph::Node v=res_graph.aNode(dfs);
 
   971 // 	      typename EAugGraph::Node w=res_graph.bNode(dfs);
 
   973 // 	      pred.set(w, EAugOutEdgeIt(dfs));
 
   974 // 	      if (res_graph.valid(pred.get(v))) {
 
   975 // 		free.set(w, std::min(free.get(v), res_graph.free(dfs)));
 
   977 // 		free.set(w, res_graph.free(dfs)); 
 
   983 // 		for(InEdgeIt f=G->template first<InEdgeIt>(n); G->valid(f); G->next(f))
 
   992 // 	      res_graph.erase(dfs);
 
   999 // 	  // typename EAugGraph::Node n=t;
 
  1000 // 	  Number augment_value=free.get(n);
 
  1001 // 	  while (res_graph.valid(pred.get(n))) { 
 
  1002 // 	    EAugEdge e=pred.get(n);
 
  1003 // 	    res_graph.augment(e, augment_value);
 
  1004 // 	    n=res_graph.tail(e);
 
  1005 // 	    if (res_graph.free(e)==0)
 
  1006 // 	      res_graph.erase(e);
 
  1015 //       //int num_of_augmentations=0;
 
  1016 //       while (augmentOnShortestPath()) { 
 
  1017 // 	//while (augmentOnBlockingFlow<MutableGraph>()) { 
 
  1018 // 	//std::cout << ++num_of_augmentations << " ";
 
  1019 // 	//std::cout<<std::endl;
 
  1022 // //     template<typename MutableGraph> void run() {
 
  1023 // //       //int num_of_augmentations=0;
 
  1024 // //       //while (augmentOnShortestPath()) { 
 
  1025 // // 	while (augmentOnBlockingFlow<MutableGraph>()) { 
 
  1026 // // 	//std::cout << ++num_of_augmentations << " ";
 
  1027 // // 	//std::cout<<std::endl;
 
  1030 //     Number flowValue() { 
 
  1033 //       for(G->/*getF*/first(e); G->valid(e); G->next(e)) {
 
  1045 // //   template <typename Graph, typename Number, typename FlowMap, typename CapacityMap>
 
  1046 // //   class MaxFlow2 {
 
  1048 // //     typedef typename Graph::Node Node;
 
  1049 // //     typedef typename Graph::Edge Edge;
 
  1050 // //     typedef typename Graph::EdgeIt EdgeIt;
 
  1051 // //     typedef typename Graph::OutEdgeIt OutEdgeIt;
 
  1052 // //     typedef typename Graph::InEdgeIt InEdgeIt;
 
  1054 // //     const Graph& G;
 
  1055 // //     std::list<Node>& S;
 
  1056 // //     std::list<Node>& T;
 
  1057 // //     FlowMap& flow;
 
  1058 // //     const CapacityMap& capacity;
 
  1059 // //     typedef ResGraphWrapper<Graph, Number, FlowMap, CapacityMap > AugGraph;
 
  1060 // //     typedef typename AugGraph::OutEdgeIt AugOutEdgeIt;
 
  1061 // //     typedef typename AugGraph::Edge AugEdge;
 
  1062 // //     typename Graph::NodeMap<bool> SMap;
 
  1063 // //     typename Graph::NodeMap<bool> TMap;
 
  1065 // //     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) { 
 
  1066 // //       for(typename std::list<Node>::const_iterator i=S.begin(); 
 
  1067 // // 	  i!=S.end(); ++i) { 
 
  1068 // // 	SMap.set(*i, true); 
 
  1070 // //       for (typename std::list<Node>::const_iterator i=T.begin(); 
 
  1071 // // 	   i!=T.end(); ++i) { 
 
  1072 // // 	TMap.set(*i, true); 
 
  1075 // //     bool augment() {
 
  1076 // //       AugGraph res_graph(G, flow, capacity);
 
  1077 // //       bool _augment=false;
 
  1078 // //       Node reached_t_node;
 
  1080 // //       typedef typename AugGraph::NodeMap<bool> ReachedMap;
 
  1081 // //       BfsIterator4< AugGraph, AugOutEdgeIt, ReachedMap > bfs(res_graph);
 
  1082 // //       for(typename std::list<Node>::const_iterator i=S.begin(); 
 
  1083 // // 	  i!=S.end(); ++i) {
 
  1084 // // 	bfs.pushAndSetReached(*i);
 
  1086 // //       //bfs.pushAndSetReached(s);
 
  1088 // //       typename AugGraph::NodeMap<AugEdge> pred(res_graph); 
 
  1089 // //       //filled up with invalid iterators
 
  1091 // //       typename AugGraph::NodeMap<Number> free(res_graph);
 
  1093 // //       //searching for augmenting path
 
  1094 // //       while ( !bfs.finished() ) { 
 
  1095 // // 	AugOutEdgeIt e=/*AugOutEdgeIt*/(bfs);
 
  1096 // // 	if (e.valid() && bfs.isBNodeNewlyReached()) {
 
  1097 // // 	  Node v=res_graph.tail(e);
 
  1098 // // 	  Node w=res_graph.head(e);
 
  1099 // // 	  pred.set(w, e);
 
  1100 // // 	  if (pred.get(v).valid()) {
 
  1101 // // 	    free.set(w, std::min(free.get(v), e.free()));
 
  1103 // // 	    free.set(w, e.free()); 
 
  1105 // // 	  if (TMap.get(res_graph.head(e))) { 
 
  1106 // // 	    _augment=true; 
 
  1107 // // 	    reached_t_node=res_graph.head(e);
 
  1113 // //       } //end of searching augmenting path
 
  1115 // //       if (_augment) {
 
  1116 // // 	Node n=reached_t_node;
 
  1117 // // 	Number augment_value=free.get(reached_t_node);
 
  1118 // // 	while (pred.get(n).valid()) { 
 
  1119 // // 	  AugEdge e=pred.get(n);
 
  1120 // // 	  e.augment(augment_value); 
 
  1121 // // 	  n=res_graph.tail(e);
 
  1125 // //       return _augment;
 
  1128 // //       while (augment()) { } 
 
  1130 // //     Number flowValue() { 
 
  1132 // //       for(typename std::list<Node>::const_iterator i=S.begin(); 
 
  1133 // // 	  i!=S.end(); ++i) { 
 
  1134 // // 	for(OutEdgeIt e=G.template first<OutEdgeIt>(*i); e.valid(); ++e) {
 
  1135 // // 	  a+=flow.get(e);
 
  1137 // // 	for(InEdgeIt e=G.template first<InEdgeIt>(*i); e.valid(); ++e) {
 
  1138 // // 	  a-=flow.get(e);
 
  1148 #endif //HUGO_EDMONDS_KARP_H