246       S get(Node nit) const { return node_map.get(nit); } | 
   246       S get(Node nit) const { return node_map.get(nit); } | 
   247     };  | 
   247     };  | 
   248   };  | 
   248   };  | 
   249   | 
   249   | 
   250   | 
   250   | 
   251   template <typename GraphWrapper, typename Number, typename FlowMap, typename CapacityMap>  | 
   251   template <typename Graph, typename Number, typename FlowMap, typename CapacityMap>  | 
   252   class MaxFlow { | 
   252   class MaxFlow { | 
   253   protected:  | 
   253   protected:  | 
   254     typedef GraphWrapper GW;  | 
   254     typedef typename Graph::Node Node;  | 
   255     typedef typename GW::Node Node;  | 
   255     typedef typename Graph::Edge Edge;  | 
   256     typedef typename GW::Edge Edge;  | 
   256     typedef typename Graph::EdgeIt EdgeIt;  | 
   257     typedef typename GW::EdgeIt EdgeIt;  | 
   257     typedef typename Graph::OutEdgeIt OutEdgeIt;  | 
   258     typedef typename GW::OutEdgeIt OutEdgeIt;  | 
   258     typedef typename Graph::InEdgeIt InEdgeIt;  | 
   259     typedef typename GW::InEdgeIt InEdgeIt;  | 
   259     const Graph* g;  | 
   260     //const Graph* G;  | 
         | 
   261     //GW gw;  | 
         | 
   262     const GW* g;  | 
         | 
   263     Node s;  | 
   260     Node s;  | 
   264     Node t;  | 
   261     Node t;  | 
   265     FlowMap* flow;  | 
   262     FlowMap* flow;  | 
   266     const CapacityMap* capacity;  | 
   263     const CapacityMap* capacity;  | 
   267     typedef ResGraphWrapper<const GW, Number, FlowMap, CapacityMap > ResGW;  | 
   264     typedef ResGraphWrapper<const Graph, Number, FlowMap, CapacityMap > ResGW;  | 
   268     typedef typename ResGW::OutEdgeIt ResGWOutEdgeIt;  | 
   265     typedef typename ResGW::OutEdgeIt ResGWOutEdgeIt;  | 
   269     typedef typename ResGW::Edge ResGWEdge;  | 
   266     typedef typename ResGW::Edge ResGWEdge;  | 
   270   public:  | 
   267   public:  | 
   271   | 
   268   | 
   272     MaxFlow(const GW& _g, Node _s, Node _t, FlowMap& _flow, const CapacityMap& _capacity) :   | 
   269     MaxFlow(const Graph& _g, Node _s, Node _t, FlowMap& _flow, const CapacityMap& _capacity) :   | 
   273       g(&_g), s(_s), t(_t), flow(&_flow), capacity(&_capacity) { } | 
   270       g(&_g), s(_s), t(_t), flow(&_flow), capacity(&_capacity) { } | 
   274   | 
   271   | 
   275     bool augmentOnShortestPath() { | 
   272     bool augmentOnShortestPath() { | 
   276       ResGW res_graph(*g, *flow, *capacity);  | 
   273       ResGW res_graph(*g, *flow, *capacity);  | 
   277       bool _augment=false;  | 
   274       bool _augment=false;  | 
   643         | 
   640         | 
   644       } //while (__augment)   | 
   641       } //while (__augment)   | 
   645               | 
   642               | 
   646       return _augment;  | 
   643       return _augment;  | 
   647     }  | 
   644     }  | 
   648   | 
         | 
   649 //     bool augmentOnBlockingFlow2() { | 
         | 
   650 //       bool _augment=false;  | 
         | 
   651   | 
         | 
   652 //       //typedef ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> EAugGraph;  | 
         | 
   653 //       typedef FilterGraphWrapper< ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> > EAugGraph;  | 
         | 
   654 //       typedef typename EAugGraph::OutEdgeIt EAugOutEdgeIt;  | 
         | 
   655 //       typedef typename EAugGraph::Edge EAugEdge;  | 
         | 
   656   | 
         | 
   657 //       EAugGraph res_graph(*G, *flow, *capacity);  | 
         | 
   658   | 
         | 
   659 //       //typedef typename EAugGraph::NodeMap<bool> ReachedMap;  | 
         | 
   660 //       BfsIterator5<   | 
         | 
   661 // 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>,   | 
         | 
   662 // 	/*typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt,*/   | 
         | 
   663 // 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<bool> > bfs(res_graph);  | 
         | 
   664         | 
         | 
   665 //       bfs.pushAndSetReached(s);  | 
         | 
   666   | 
         | 
   667 //       typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::  | 
         | 
   668 // 	NodeMap<int>& dist=res_graph.dist;  | 
         | 
   669   | 
         | 
   670 //       while ( !bfs.finished() ) { | 
         | 
   671 // 	typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt e=bfs;  | 
         | 
   672 // 	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) { | 
         | 
   673 // 	  dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);  | 
         | 
   674 // 	}  | 
         | 
   675 // 	++bfs;	  | 
         | 
   676 //       } //computing distances from s in the residual graph  | 
         | 
   677   | 
         | 
   678 //       bool __augment=true;  | 
         | 
   679   | 
         | 
   680 //       while (__augment) { | 
         | 
   681   | 
         | 
   682 // 	__augment=false;  | 
         | 
   683 // 	//computing blocking flow with dfs  | 
         | 
   684 // 	typedef typename EAugGraph::NodeMap<bool> BlockingReachedMap;  | 
         | 
   685 // 	DfsIterator5< EAugGraph/*, EAugOutEdgeIt*/, BlockingReachedMap >   | 
         | 
   686 // 	  dfs(res_graph);  | 
         | 
   687 // 	typename EAugGraph::NodeMap<EAugEdge> pred(res_graph);   | 
         | 
   688 // 	pred.set(s, EAugEdge(INVALID));  | 
         | 
   689 // 	//invalid iterators for sources  | 
         | 
   690   | 
         | 
   691 // 	typename EAugGraph::NodeMap<Number> free(res_graph);  | 
         | 
   692   | 
         | 
   693 // 	dfs.pushAndSetReached(s);  | 
         | 
   694 // 	while (!dfs.finished()) { | 
         | 
   695 // 	  ++dfs;  | 
         | 
   696 // 	  if (res_graph.valid(EAugOutEdgeIt(dfs))) {  | 
         | 
   697 // 	    if (dfs.isBNodeNewlyReached()) { | 
         | 
   698 	    | 
         | 
   699 // 	      typename EAugGraph::Node v=res_graph.aNode(dfs);  | 
         | 
   700 // 	      typename EAugGraph::Node w=res_graph.bNode(dfs);  | 
         | 
   701   | 
         | 
   702 // 	      pred.set(w, EAugOutEdgeIt(dfs));  | 
         | 
   703 // 	      if (res_graph.valid(pred.get(v))) { | 
         | 
   704 // 		free.set(w, std::min(free.get(v), res_graph.free(dfs)));  | 
         | 
   705 // 	      } else { | 
         | 
   706 // 		free.set(w, res_graph.free(dfs));   | 
         | 
   707 // 	      }  | 
         | 
   708 	        | 
         | 
   709 // 	      if (w==t) {  | 
         | 
   710 // 		__augment=true;   | 
         | 
   711 // 		_augment=true;  | 
         | 
   712 // 		break;   | 
         | 
   713 // 	      }  | 
         | 
   714 // 	    } else { | 
         | 
   715 // 	      res_graph.erase(dfs);  | 
         | 
   716 // 	    }  | 
         | 
   717 // 	  }   | 
         | 
   718   | 
         | 
   719 // 	}  | 
         | 
   720   | 
         | 
   721 // 	if (__augment) { | 
         | 
   722 // 	  typename EAugGraph::Node n=t;  | 
         | 
   723 // 	  Number augment_value=free.get(t);  | 
         | 
   724 // 	  while (res_graph.valid(pred.get(n))) {  | 
         | 
   725 // 	    EAugEdge e=pred.get(n);  | 
         | 
   726 // 	    res_graph.augment(e, augment_value);  | 
         | 
   727 // 	    n=res_graph.tail(e);  | 
         | 
   728 // 	    if (res_graph.free(e)==0)  | 
         | 
   729 // 	      res_graph.erase(e);  | 
         | 
   730 // 	  }  | 
         | 
   731 // 	}  | 
         | 
   732         | 
         | 
   733 //       }  | 
         | 
   734               | 
         | 
   735 //       return _augment;  | 
         | 
   736 //     }  | 
         | 
   737   | 
   645   | 
   738     void run() { | 
   646     void run() { | 
   739       //int num_of_augmentations=0;  | 
   647       //int num_of_augmentations=0;  | 
   740       while (augmentOnShortestPath()) {  | 
   648       while (augmentOnShortestPath()) {  | 
   741 	//while (augmentOnBlockingFlow<MutableGraph>()) {  | 
   649 	//while (augmentOnBlockingFlow<MutableGraph>()) {  |