|         |      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 #include <graph_wrapper.h> | 
|         |     12 #include <maps.h> | 
|         |     13 #include <for_each_macros.h> | 
|         |     14  | 
|         |     15 namespace hugo { | 
|         |     16  | 
|         |     17   template <typename Graph, typename Num,  | 
|         |     18 	    typename CapMap, typename FlowMap> | 
|         |     19   class MaxFlow { | 
|         |     20   protected: | 
|         |     21     typedef typename Graph::Node Node; | 
|         |     22     typedef typename Graph::Edge Edge; | 
|         |     23     typedef typename Graph::EdgeIt EdgeIt; | 
|         |     24     typedef typename Graph::OutEdgeIt OutEdgeIt; | 
|         |     25     typedef typename Graph::InEdgeIt InEdgeIt; | 
|         |     26     const Graph* g; | 
|         |     27     Node s; | 
|         |     28     Node t; | 
|         |     29     const CapMap* capacity; | 
|         |     30     FlowMap* flow; | 
|         |     31     typedef ResGraphWrapper<const Graph, Num, CapMap, FlowMap> ResGW; | 
|         |     32     typedef typename ResGW::OutEdgeIt ResGWOutEdgeIt; | 
|         |     33     typedef typename ResGW::Edge ResGWEdge; | 
|         |     34     //typedef typename ResGW::template NodeMap<bool> ReachedMap; | 
|         |     35     typedef typename Graph::template NodeMap<bool> ReachedMap; | 
|         |     36     ReachedMap level; | 
|         |     37     //reached is called level because of compatibility with preflow | 
|         |     38   public: | 
|         |     39  | 
|         |     40     MaxFlow(const Graph& _g, Node _s, Node _t, const CapMap& _capacity,  | 
|         |     41 	    FlowMap& _flow) :  | 
|         |     42       g(&_g), s(_s), t(_t), capacity(&_capacity), flow(&_flow), level(_g) { } | 
|         |     43  | 
|         |     44     bool augmentOnShortestPath() { | 
|         |     45       ResGW res_graph(*g, *capacity, *flow); | 
|         |     46       bool _augment=false; | 
|         |     47        | 
|         |     48       //ReachedMap level(res_graph); | 
|         |     49       FOR_EACH_LOC(typename Graph::NodeIt, e, *g) level.set(e, 0); | 
|         |     50       BfsIterator<ResGW, ReachedMap> bfs(res_graph, level); | 
|         |     51       bfs.pushAndSetReached(s); | 
|         |     52 	 | 
|         |     53       typename ResGW::template NodeMap<ResGWEdge> pred(res_graph);  | 
|         |     54       pred.set(s, INVALID); | 
|         |     55        | 
|         |     56       typename ResGW::template NodeMap<Num> free(res_graph); | 
|         |     57 	 | 
|         |     58       //searching for augmenting path | 
|         |     59       while ( !bfs.finished() ) {  | 
|         |     60 	ResGWOutEdgeIt e=bfs; | 
|         |     61 	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) { | 
|         |     62 	  Node v=res_graph.tail(e); | 
|         |     63 	  Node w=res_graph.head(e); | 
|         |     64 	  pred.set(w, e); | 
|         |     65 	  if (res_graph.valid(pred[v])) { | 
|         |     66 	    free.set(w, std::min(free[v], res_graph.resCap(e))); | 
|         |     67 	  } else { | 
|         |     68 	    free.set(w, res_graph.resCap(e));  | 
|         |     69 	  } | 
|         |     70 	  if (res_graph.head(e)==t) { _augment=true; break; } | 
|         |     71 	} | 
|         |     72 	 | 
|         |     73 	++bfs; | 
|         |     74       } //end of searching augmenting path | 
|         |     75  | 
|         |     76       if (_augment) { | 
|         |     77 	Node n=t; | 
|         |     78 	Num augment_value=free[t]; | 
|         |     79 	while (res_graph.valid(pred[n])) {  | 
|         |     80 	  ResGWEdge e=pred[n]; | 
|         |     81 	  res_graph.augment(e, augment_value);  | 
|         |     82 	  n=res_graph.tail(e); | 
|         |     83 	} | 
|         |     84       } | 
|         |     85  | 
|         |     86       return _augment; | 
|         |     87     } | 
|         |     88  | 
|         |     89     template<typename MapGraphWrapper>  | 
|         |     90     class DistanceMap { | 
|         |     91     protected: | 
|         |     92       const MapGraphWrapper* g; | 
|         |     93       typename MapGraphWrapper::template NodeMap<int> dist;  | 
|         |     94     public: | 
|         |     95       DistanceMap(MapGraphWrapper& _g) : g(&_g), dist(*g, g->nodeNum()) { } | 
|         |     96       void set(const typename MapGraphWrapper::Node& n, int a) {  | 
|         |     97 	dist.set(n, a);  | 
|         |     98       } | 
|         |     99       int operator[](const typename MapGraphWrapper::Node& n)  | 
|         |    100 	{ return dist[n]; } | 
|         |    101 //       int get(const typename MapGraphWrapper::Node& n) const {  | 
|         |    102 // 	return dist[n]; } | 
|         |    103 //       bool get(const typename MapGraphWrapper::Edge& e) const {  | 
|         |    104 // 	return (dist.get(g->tail(e))<dist.get(g->head(e))); } | 
|         |    105       bool operator[](const typename MapGraphWrapper::Edge& e) const {  | 
|         |    106 	return (dist[g->tail(e)]<dist[g->head(e)]);  | 
|         |    107       } | 
|         |    108     }; | 
|         |    109  | 
|         |    110     template<typename MutableGraph> bool augmentOnBlockingFlow() {       | 
|         |    111       typedef MutableGraph MG; | 
|         |    112       bool _augment=false; | 
|         |    113  | 
|         |    114       ResGW res_graph(*g, *capacity, *flow); | 
|         |    115  | 
|         |    116       //ReachedMap level(res_graph); | 
|         |    117       FOR_EACH_LOC(typename Graph::NodeIt, e, *g) level.set(e, 0); | 
|         |    118       BfsIterator<ResGW, ReachedMap> bfs(res_graph, level); | 
|         |    119  | 
|         |    120       bfs.pushAndSetReached(s); | 
|         |    121       //typename ResGW::NodeMap<int> dist(res_graph); //filled up with 0's | 
|         |    122       DistanceMap<ResGW> dist(res_graph); | 
|         |    123       while ( !bfs.finished() ) {  | 
|         |    124 	ResGWOutEdgeIt e=bfs; | 
|         |    125 	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) { | 
|         |    126 	  dist.set(res_graph.head(e), dist[res_graph.tail(e)]+1); | 
|         |    127 	} | 
|         |    128 	++bfs; | 
|         |    129       } //computing distances from s in the residual graph | 
|         |    130  | 
|         |    131       MG F; | 
|         |    132       ConstMap<typename ResGW::Node, bool> true_map(true); | 
|         |    133       typedef SubGraphWrapper<ResGW, ConstMap<typename ResGW::Node, bool>,  | 
|         |    134 	DistanceMap<ResGW> > FilterResGW; | 
|         |    135       FilterResGW filter_res_graph(res_graph, true_map, dist); | 
|         |    136       typename ResGW::template NodeMap<typename MG::Node>  | 
|         |    137 	res_graph_to_F(res_graph); | 
|         |    138       { | 
|         |    139 	typename ResGW::NodeIt n; | 
|         |    140 	for(res_graph.first(n); res_graph.valid(n); res_graph.next(n)) { | 
|         |    141 	  res_graph_to_F.set(n, F.addNode()); | 
|         |    142 	} | 
|         |    143       } | 
|         |    144  | 
|         |    145       typename MG::Node sF=res_graph_to_F[s]; | 
|         |    146       typename MG::Node tF=res_graph_to_F[t]; | 
|         |    147       typename MG::template EdgeMap<ResGWEdge> original_edge(F); | 
|         |    148       typename MG::template EdgeMap<Num> residual_capacity(F); | 
|         |    149  | 
|         |    150       //Making F to the graph containing the edges of the residual graph  | 
|         |    151       //which are in some shortest paths | 
|         |    152       { | 
|         |    153 	typename FilterResGW::EdgeIt e; | 
|         |    154 	for(filter_res_graph.first(e); filter_res_graph.valid(e); filter_res_graph.next(e)) { | 
|         |    155 	  //if (dist.get(res_graph.head(e))==dist.get(res_graph.tail(e))+1) { | 
|         |    156 	  typename MG::Edge f=F.addEdge(res_graph_to_F[res_graph.tail(e)], res_graph_to_F[res_graph.head(e)]); | 
|         |    157 	  original_edge.update(); | 
|         |    158 	  original_edge.set(f, e); | 
|         |    159 	  residual_capacity.update(); | 
|         |    160 	  residual_capacity.set(f, res_graph.resCap(e)); | 
|         |    161 	  //}  | 
|         |    162 	} | 
|         |    163       } | 
|         |    164  | 
|         |    165       bool __augment=true; | 
|         |    166  | 
|         |    167       while (__augment) { | 
|         |    168 	__augment=false; | 
|         |    169 	//computing blocking flow with dfs | 
|         |    170  | 
|         |    171 	DfsIterator< MG, typename MG::template NodeMap<bool> > dfs(F); | 
|         |    172 	typename MG::template NodeMap<typename MG::Edge> pred(F); | 
|         |    173 	pred.set(sF, INVALID); | 
|         |    174 	//invalid iterators for sources | 
|         |    175  | 
|         |    176 	typename MG::template NodeMap<Num> free(F); | 
|         |    177  | 
|         |    178 	dfs.pushAndSetReached(sF);       | 
|         |    179 	while (!dfs.finished()) { | 
|         |    180 	  ++dfs; | 
|         |    181 	  if (F.valid(/*typename MG::OutEdgeIt*/(dfs))) { | 
|         |    182 	    if (dfs.isBNodeNewlyReached()) { | 
|         |    183 	      typename MG::Node v=F.aNode(dfs); | 
|         |    184 	      typename MG::Node w=F.bNode(dfs); | 
|         |    185 	      pred.set(w, dfs); | 
|         |    186 	      if (F.valid(pred[v])) { | 
|         |    187 		free.set(w, std::min(free[v], residual_capacity[dfs])); | 
|         |    188 	      } else { | 
|         |    189 		free.set(w, residual_capacity[dfs]);  | 
|         |    190 	      } | 
|         |    191 	      if (w==tF) {  | 
|         |    192 		__augment=true;  | 
|         |    193 		_augment=true; | 
|         |    194 		break;  | 
|         |    195 	      } | 
|         |    196 	       | 
|         |    197 	    } else { | 
|         |    198 	      F.erase(/*typename MG::OutEdgeIt*/(dfs)); | 
|         |    199 	    } | 
|         |    200 	  }  | 
|         |    201 	} | 
|         |    202  | 
|         |    203 	if (__augment) { | 
|         |    204 	  typename MG::Node n=tF; | 
|         |    205 	  Num augment_value=free[tF]; | 
|         |    206 	  while (F.valid(pred[n])) {  | 
|         |    207 	    typename MG::Edge e=pred[n]; | 
|         |    208 	    res_graph.augment(original_edge[e], augment_value);  | 
|         |    209 	    n=F.tail(e); | 
|         |    210 	    if (residual_capacity[e]==augment_value)  | 
|         |    211 	      F.erase(e);  | 
|         |    212 	    else  | 
|         |    213 	      residual_capacity.set(e, residual_capacity[e]-augment_value); | 
|         |    214 	  } | 
|         |    215 	} | 
|         |    216 	 | 
|         |    217       } | 
|         |    218              | 
|         |    219       return _augment; | 
|         |    220     } | 
|         |    221  | 
|         |    222     template<typename MutableGraph> bool augmentOnBlockingFlow1() {       | 
|         |    223       typedef MutableGraph MG; | 
|         |    224       bool _augment=false; | 
|         |    225  | 
|         |    226       ResGW res_graph(*g, *capacity, *flow); | 
|         |    227  | 
|         |    228       //bfs for distances on the residual graph | 
|         |    229       //ReachedMap level(res_graph); | 
|         |    230       FOR_EACH_LOC(typename Graph::NodeIt, e, *g) level.set(e, 0); | 
|         |    231       BfsIterator<ResGW, ReachedMap> bfs(res_graph, level); | 
|         |    232       bfs.pushAndSetReached(s); | 
|         |    233       typename ResGW::template NodeMap<int>  | 
|         |    234 	dist(res_graph); //filled up with 0's | 
|         |    235  | 
|         |    236       //F will contain the physical copy of the residual graph | 
|         |    237       //with the set of edges which are on shortest paths | 
|         |    238       MG F; | 
|         |    239       typename ResGW::template NodeMap<typename MG::Node>  | 
|         |    240 	res_graph_to_F(res_graph); | 
|         |    241       { | 
|         |    242 	typename ResGW::NodeIt n; | 
|         |    243 	for(res_graph.first(n); res_graph.valid(n); res_graph.next(n)) { | 
|         |    244 	  res_graph_to_F.set(n, F.addNode()); | 
|         |    245 	} | 
|         |    246       } | 
|         |    247  | 
|         |    248       typename MG::Node sF=res_graph_to_F[s]; | 
|         |    249       typename MG::Node tF=res_graph_to_F[t]; | 
|         |    250       typename MG::template EdgeMap<ResGWEdge> original_edge(F); | 
|         |    251       typename MG::template EdgeMap<Num> residual_capacity(F); | 
|         |    252  | 
|         |    253       while ( !bfs.finished() ) {  | 
|         |    254 	ResGWOutEdgeIt e=bfs; | 
|         |    255 	if (res_graph.valid(e)) { | 
|         |    256 	  if (bfs.isBNodeNewlyReached()) { | 
|         |    257 	    dist.set(res_graph.head(e), dist[res_graph.tail(e)]+1); | 
|         |    258 	    typename MG::Edge f=F.addEdge(res_graph_to_F[res_graph.tail(e)], res_graph_to_F[res_graph.head(e)]); | 
|         |    259 	    original_edge.update(); | 
|         |    260 	    original_edge.set(f, e); | 
|         |    261 	    residual_capacity.update(); | 
|         |    262 	    residual_capacity.set(f, res_graph.resCap(e)); | 
|         |    263 	  } else { | 
|         |    264 	    if (dist[res_graph.head(e)]==(dist[res_graph.tail(e)]+1)) { | 
|         |    265 	      typename MG::Edge f=F.addEdge(res_graph_to_F[res_graph.tail(e)], res_graph_to_F[res_graph.head(e)]); | 
|         |    266 	      original_edge.update(); | 
|         |    267 	      original_edge.set(f, e); | 
|         |    268 	      residual_capacity.update(); | 
|         |    269 	      residual_capacity.set(f, res_graph.resCap(e)); | 
|         |    270 	    } | 
|         |    271 	  } | 
|         |    272 	} | 
|         |    273 	++bfs; | 
|         |    274       } //computing distances from s in the residual graph | 
|         |    275  | 
|         |    276       bool __augment=true; | 
|         |    277  | 
|         |    278       while (__augment) { | 
|         |    279 	__augment=false; | 
|         |    280 	//computing blocking flow with dfs | 
|         |    281 	DfsIterator< MG, typename MG::template NodeMap<bool> > dfs(F); | 
|         |    282 	typename MG::template NodeMap<typename MG::Edge> pred(F); | 
|         |    283 	pred.set(sF, INVALID); | 
|         |    284 	//invalid iterators for sources | 
|         |    285  | 
|         |    286 	typename MG::template NodeMap<Num> free(F); | 
|         |    287  | 
|         |    288 	dfs.pushAndSetReached(sF);       | 
|         |    289 	while (!dfs.finished()) { | 
|         |    290 	  ++dfs; | 
|         |    291 	  if (F.valid(/*typename MG::OutEdgeIt*/(dfs))) { | 
|         |    292 	    if (dfs.isBNodeNewlyReached()) { | 
|         |    293 	      typename MG::Node v=F.aNode(dfs); | 
|         |    294 	      typename MG::Node w=F.bNode(dfs); | 
|         |    295 	      pred.set(w, dfs); | 
|         |    296 	      if (F.valid(pred[v])) { | 
|         |    297 		free.set(w, std::min(free[v], residual_capacity[dfs])); | 
|         |    298 	      } else { | 
|         |    299 		free.set(w, residual_capacity[dfs]);  | 
|         |    300 	      } | 
|         |    301 	      if (w==tF) {  | 
|         |    302 		__augment=true;  | 
|         |    303 		_augment=true; | 
|         |    304 		break;  | 
|         |    305 	      } | 
|         |    306 	       | 
|         |    307 	    } else { | 
|         |    308 	      F.erase(/*typename MG::OutEdgeIt*/(dfs)); | 
|         |    309 	    } | 
|         |    310 	  }  | 
|         |    311 	} | 
|         |    312  | 
|         |    313 	if (__augment) { | 
|         |    314 	  typename MG::Node n=tF; | 
|         |    315 	  Num augment_value=free[tF]; | 
|         |    316 	  while (F.valid(pred[n])) {  | 
|         |    317 	    typename MG::Edge e=pred[n]; | 
|         |    318 	    res_graph.augment(original_edge[e], augment_value);  | 
|         |    319 	    n=F.tail(e); | 
|         |    320 	    if (residual_capacity[e]==augment_value)  | 
|         |    321 	      F.erase(e);  | 
|         |    322 	    else  | 
|         |    323 	      residual_capacity.set(e, residual_capacity[e]-augment_value); | 
|         |    324 	  } | 
|         |    325 	} | 
|         |    326 	 | 
|         |    327       } | 
|         |    328              | 
|         |    329       return _augment; | 
|         |    330     } | 
|         |    331  | 
|         |    332     bool augmentOnBlockingFlow2() { | 
|         |    333       bool _augment=false; | 
|         |    334  | 
|         |    335       ResGW res_graph(*g, *capacity, *flow); | 
|         |    336        | 
|         |    337       //ReachedMap level(res_graph); | 
|         |    338       FOR_EACH_LOC(typename Graph::NodeIt, e, *g) level.set(e, 0); | 
|         |    339       BfsIterator<ResGW, ReachedMap> bfs(res_graph, level); | 
|         |    340  | 
|         |    341       bfs.pushAndSetReached(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[res_graph.tail(e)]+1); | 
|         |    347  	} | 
|         |    348 	++bfs; | 
|         |    349       } //computing distances from s in the residual graph | 
|         |    350  | 
|         |    351       //Subgraph containing the edges on some shortest paths | 
|         |    352       ConstMap<typename ResGW::Node, bool> true_map(true); | 
|         |    353       typedef SubGraphWrapper<ResGW, ConstMap<typename ResGW::Node, bool>,  | 
|         |    354 	DistanceMap<ResGW> > FilterResGW; | 
|         |    355       FilterResGW filter_res_graph(res_graph, true_map, dist); | 
|         |    356  | 
|         |    357       //Subgraph, which is able to delete edges which are already  | 
|         |    358       //met by the dfs | 
|         |    359       typename FilterResGW::template NodeMap<typename FilterResGW::OutEdgeIt>  | 
|         |    360  	first_out_edges(filter_res_graph); | 
|         |    361       typename FilterResGW::NodeIt v; | 
|         |    362       for(filter_res_graph.first(v); filter_res_graph.valid(v);  | 
|         |    363  	  filter_res_graph.next(v))  | 
|         |    364       { | 
|         |    365  	typename FilterResGW::OutEdgeIt e; | 
|         |    366  	filter_res_graph.first(e, v); | 
|         |    367  	first_out_edges.set(v, e); | 
|         |    368       } | 
|         |    369       typedef ErasingFirstGraphWrapper<FilterResGW, typename FilterResGW:: | 
|         |    370 	template NodeMap<typename FilterResGW::OutEdgeIt> > ErasingResGW; | 
|         |    371       ErasingResGW erasing_res_graph(filter_res_graph, first_out_edges); | 
|         |    372  | 
|         |    373       bool __augment=true; | 
|         |    374  | 
|         |    375       while (__augment) { | 
|         |    376  | 
|         |    377  	__augment=false; | 
|         |    378   	//computing blocking flow with dfs | 
|         |    379   	DfsIterator< ErasingResGW,  | 
|         |    380 	  typename ErasingResGW::template NodeMap<bool> >  | 
|         |    381   	  dfs(erasing_res_graph); | 
|         |    382  	typename ErasingResGW:: | 
|         |    383 	  template NodeMap<typename ErasingResGW::OutEdgeIt>  | 
|         |    384 	  pred(erasing_res_graph);  | 
|         |    385  	pred.set(s, INVALID); | 
|         |    386   	//invalid iterators for sources | 
|         |    387  | 
|         |    388   	typename ErasingResGW::template NodeMap<Num>  | 
|         |    389 	  free1(erasing_res_graph); | 
|         |    390  | 
|         |    391  	dfs.pushAndSetReached( | 
|         |    392 	  typename ErasingResGW::Node( | 
|         |    393 	    typename FilterResGW::Node( | 
|         |    394 	      typename ResGW::Node(s) | 
|         |    395 	      ) | 
|         |    396 	    ) | 
|         |    397 	  ); | 
|         |    398  	while (!dfs.finished()) { | 
|         |    399  	  ++dfs; | 
|         |    400  	  if (erasing_res_graph.valid( | 
|         |    401  		typename ErasingResGW::OutEdgeIt(dfs)))  | 
|         |    402  	  {  | 
|         |    403   	    if (dfs.isBNodeNewlyReached()) { | 
|         |    404 	   | 
|         |    405  	      typename ErasingResGW::Node v=erasing_res_graph.aNode(dfs); | 
|         |    406  	      typename ErasingResGW::Node w=erasing_res_graph.bNode(dfs); | 
|         |    407  | 
|         |    408  	      pred.set(w, /*typename ErasingResGW::OutEdgeIt*/(dfs)); | 
|         |    409  	      if (erasing_res_graph.valid(pred[v])) { | 
|         |    410  		free1.set(w, std::min(free1[v], res_graph.resCap( | 
|         |    411 				       typename ErasingResGW::OutEdgeIt(dfs)))); | 
|         |    412  	      } else { | 
|         |    413  		free1.set(w, res_graph.resCap( | 
|         |    414 			   typename ErasingResGW::OutEdgeIt(dfs)));  | 
|         |    415  	      } | 
|         |    416 	       | 
|         |    417  	      if (w==t) {  | 
|         |    418  		__augment=true;  | 
|         |    419  		_augment=true; | 
|         |    420  		break;  | 
|         |    421  	      } | 
|         |    422  	    } else { | 
|         |    423  	      erasing_res_graph.erase(dfs); | 
|         |    424 	    } | 
|         |    425 	  } | 
|         |    426 	}	 | 
|         |    427  | 
|         |    428   	if (__augment) { | 
|         |    429    	  typename ErasingResGW::Node n=typename FilterResGW::Node(typename ResGW::Node(t)); | 
|         |    430 // 	  typename ResGW::NodeMap<Num> a(res_graph); | 
|         |    431 // 	  typename ResGW::Node b; | 
|         |    432 // 	  Num j=a[b]; | 
|         |    433 // 	  typename FilterResGW::NodeMap<Num> a1(filter_res_graph); | 
|         |    434 // 	  typename FilterResGW::Node b1; | 
|         |    435 // 	  Num j1=a1[b1]; | 
|         |    436 // 	  typename ErasingResGW::NodeMap<Num> a2(erasing_res_graph); | 
|         |    437 // 	  typename ErasingResGW::Node b2; | 
|         |    438 // 	  Num j2=a2[b2]; | 
|         |    439  	  Num augment_value=free1[n]; | 
|         |    440  	  while (erasing_res_graph.valid(pred[n])) {  | 
|         |    441  	    typename ErasingResGW::OutEdgeIt e=pred[n]; | 
|         |    442  	    res_graph.augment(e, augment_value); | 
|         |    443  	    n=erasing_res_graph.tail(e); | 
|         |    444  	    if (res_graph.resCap(e)==0) | 
|         |    445  	      erasing_res_graph.erase(e); | 
|         |    446 	} | 
|         |    447       } | 
|         |    448        | 
|         |    449       } //while (__augment)  | 
|         |    450              | 
|         |    451       return _augment; | 
|         |    452     } | 
|         |    453  | 
|         |    454     void run() { | 
|         |    455       //int num_of_augmentations=0; | 
|         |    456       while (augmentOnShortestPath()) {  | 
|         |    457 	//while (augmentOnBlockingFlow<MutableGraph>()) {  | 
|         |    458 	//std::cout << ++num_of_augmentations << " "; | 
|         |    459 	//std::cout<<std::endl; | 
|         |    460       }  | 
|         |    461     } | 
|         |    462  | 
|         |    463     template<typename MutableGraph> void run() { | 
|         |    464       //int num_of_augmentations=0; | 
|         |    465       //while (augmentOnShortestPath()) {  | 
|         |    466 	while (augmentOnBlockingFlow<MutableGraph>()) {  | 
|         |    467 	//std::cout << ++num_of_augmentations << " "; | 
|         |    468 	//std::cout<<std::endl; | 
|         |    469       }  | 
|         |    470     } | 
|         |    471  | 
|         |    472     Num flowValue() {  | 
|         |    473       Num a=0; | 
|         |    474       OutEdgeIt e; | 
|         |    475       for(g->first(e, s); g->valid(e); g->next(e)) { | 
|         |    476 	a+=(*flow)[e]; | 
|         |    477       } | 
|         |    478       return a; | 
|         |    479     } | 
|         |    480  | 
|         |    481   }; | 
|         |    482  | 
|         |    483  | 
|         |    484 //   template <typename Graph, typename Num, typename FlowMap, typename CapMap> | 
|         |    485 //   class MaxMatching { | 
|         |    486 //   public: | 
|         |    487 //     typedef typename Graph::Node Node; | 
|         |    488 //     typedef typename Graph::NodeIt NodeIt; | 
|         |    489 //     typedef typename Graph::Edge Edge; | 
|         |    490 //     typedef typename Graph::EdgeIt EdgeIt; | 
|         |    491 //     typedef typename Graph::OutEdgeIt OutEdgeIt; | 
|         |    492 //     typedef typename Graph::InEdgeIt InEdgeIt; | 
|         |    493  | 
|         |    494 //     typedef typename Graph::NodeMap<bool> SMap; | 
|         |    495 //     typedef typename Graph::NodeMap<bool> TMap; | 
|         |    496 //   private: | 
|         |    497 //     const Graph* G; | 
|         |    498 //     SMap* S; | 
|         |    499 //     TMap* T; | 
|         |    500 //     //Node s; | 
|         |    501 //     //Node t; | 
|         |    502 //     FlowMap* flow; | 
|         |    503 //     const CapMap* capacity; | 
|         |    504 //     typedef ResGraphWrapper<Graph, Num, FlowMap, CapMap > AugGraph; | 
|         |    505 //     typedef typename AugGraph::OutEdgeIt AugOutEdgeIt; | 
|         |    506 //     typedef typename AugGraph::Edge AugEdge; | 
|         |    507 //     typename Graph::NodeMap<int> used; //0 | 
|         |    508  | 
|         |    509 //   public: | 
|         |    510 //     MaxMatching(const Graph& _G, SMap& _S, TMap& _T, FlowMap& _flow, const CapMap& _capacity) :  | 
|         |    511 //       G(&_G), S(&_S), T(&_T), flow(&_flow), capacity(&_capacity), used(_G) { } | 
|         |    512 //     bool augmentOnShortestPath() { | 
|         |    513 //       AugGraph res_graph(*G, *flow, *capacity); | 
|         |    514 //       bool _augment=false; | 
|         |    515        | 
|         |    516 //       typedef typename AugGraph::NodeMap<bool> ReachedMap; | 
|         |    517 //       BfsIterator< AugGraph, /*AugOutEdgeIt,*/ ReachedMap > bfs(res_graph); | 
|         |    518 //       typename AugGraph::NodeMap<AugEdge> pred(res_graph);  | 
|         |    519 //       for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) { | 
|         |    520 // 	if ((S->get(s)) && (used.get(s)<1) ) { | 
|         |    521 // 	  //Num u=0; | 
|         |    522 // 	  //for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e)) | 
|         |    523 // 	  //u+=flow->get(e); | 
|         |    524 // 	  //if (u<1) { | 
|         |    525 // 	    bfs.pushAndSetReached(s); | 
|         |    526 // 	    pred.set(s, AugEdge(INVALID)); | 
|         |    527 // 	    //} | 
|         |    528 // 	} | 
|         |    529 //       } | 
|         |    530        | 
|         |    531 //       typename AugGraph::NodeMap<Num> free(res_graph); | 
|         |    532 	 | 
|         |    533 //       Node n; | 
|         |    534 //       //searching for augmenting path | 
|         |    535 //       while ( !bfs.finished() ) {  | 
|         |    536 // 	AugOutEdgeIt e=bfs; | 
|         |    537 // 	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) { | 
|         |    538 // 	  Node v=res_graph.tail(e); | 
|         |    539 // 	  Node w=res_graph.head(e); | 
|         |    540 // 	  pred.set(w, e); | 
|         |    541 // 	  if (res_graph.valid(pred.get(v))) { | 
|         |    542 // 	    free.set(w, std::min(free.get(v), res_graph.free(e))); | 
|         |    543 // 	  } else { | 
|         |    544 // 	    free.set(w, res_graph.free(e));  | 
|         |    545 // 	  } | 
|         |    546 // 	  n=res_graph.head(e); | 
|         |    547 // 	  if (T->get(n) && (used.get(n)<1) ) {  | 
|         |    548 // 	    //Num u=0; | 
|         |    549 // 	    //for(InEdgeIt f=G->template first<InEdgeIt>(n); G->valid(f); G->next(f)) | 
|         |    550 // 	    //u+=flow->get(f); | 
|         |    551 // 	    //if (u<1) { | 
|         |    552 // 	      _augment=true;  | 
|         |    553 // 	      break;  | 
|         |    554 // 	      //} | 
|         |    555 // 	  } | 
|         |    556 // 	} | 
|         |    557 	 | 
|         |    558 // 	++bfs; | 
|         |    559 //       } //end of searching augmenting path | 
|         |    560  | 
|         |    561 //       if (_augment) { | 
|         |    562 // 	//Node n=t; | 
|         |    563 // 	used.set(n, 1); //mind2 vegen jav | 
|         |    564 // 	Num augment_value=free.get(n); | 
|         |    565 // 	while (res_graph.valid(pred.get(n))) {  | 
|         |    566 // 	  AugEdge e=pred.get(n); | 
|         |    567 // 	  res_graph.augment(e, augment_value);  | 
|         |    568 // 	  n=res_graph.tail(e); | 
|         |    569 // 	} | 
|         |    570 // 	used.set(n, 1); //mind2 vegen jav | 
|         |    571 //       } | 
|         |    572  | 
|         |    573 //       return _augment; | 
|         |    574 //     } | 
|         |    575  | 
|         |    576 // //     template<typename MutableGraph> bool augmentOnBlockingFlow() {       | 
|         |    577 // //       bool _augment=false; | 
|         |    578  | 
|         |    579 // //       AugGraph res_graph(*G, *flow, *capacity); | 
|         |    580  | 
|         |    581 // //       typedef typename AugGraph::NodeMap<bool> ReachedMap; | 
|         |    582 // //       BfsIterator4< AugGraph, AugOutEdgeIt, ReachedMap > bfs(res_graph); | 
|         |    583  | 
|         |    584  | 
|         |    585  | 
|         |    586  | 
|         |    587  | 
|         |    588 // //       //typename AugGraph::NodeMap<AugEdge> pred(res_graph);  | 
|         |    589 // //       for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) { | 
|         |    590 // // 	if (S->get(s)) { | 
|         |    591 // // 	  Num u=0; | 
|         |    592 // // 	  for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e)) | 
|         |    593 // // 	    u+=flow->get(e); | 
|         |    594 // // 	  if (u<1) { | 
|         |    595 // // 	    bfs.pushAndSetReached(s); | 
|         |    596 // // 	    //pred.set(s, AugEdge(INVALID)); | 
|         |    597 // // 	  } | 
|         |    598 // // 	} | 
|         |    599 // //       } | 
|         |    600  | 
|         |    601  | 
|         |    602  | 
|         |    603  | 
|         |    604 // //       //bfs.pushAndSetReached(s); | 
|         |    605 // //       typename AugGraph::NodeMap<int> dist(res_graph); //filled up with 0's | 
|         |    606 // //       while ( !bfs.finished() ) {  | 
|         |    607 // // 	AugOutEdgeIt e=bfs; | 
|         |    608 // // 	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) { | 
|         |    609 // // 	  dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1); | 
|         |    610 // // 	} | 
|         |    611 	 | 
|         |    612 // // 	++bfs; | 
|         |    613 // //       } //computing distances from s in the residual graph | 
|         |    614  | 
|         |    615 // //       MutableGraph F; | 
|         |    616 // //       typename AugGraph::NodeMap<typename MutableGraph::Node>  | 
|         |    617 // // 	res_graph_to_F(res_graph); | 
|         |    618 // //       for(typename AugGraph::NodeIt n=res_graph.template first<typename AugGraph::NodeIt>(); res_graph.valid(n); res_graph.next(n)) { | 
|         |    619 // // 	res_graph_to_F.set(n, F.addNode()); | 
|         |    620 // //       } | 
|         |    621        | 
|         |    622 // //       typename MutableGraph::Node sF=res_graph_to_F.get(s); | 
|         |    623 // //       typename MutableGraph::Node tF=res_graph_to_F.get(t); | 
|         |    624  | 
|         |    625 // //       typename MutableGraph::EdgeMap<AugEdge> original_edge(F); | 
|         |    626 // //       typename MutableGraph::EdgeMap<Num> residual_capacity(F); | 
|         |    627  | 
|         |    628 // //       //Making F to the graph containing the edges of the residual graph  | 
|         |    629 // //       //which are in some shortest paths | 
|         |    630 // //       for(typename AugGraph::EdgeIt e=res_graph.template first<typename AugGraph::EdgeIt>(); res_graph.valid(e); res_graph.next(e)) { | 
|         |    631 // // 	if (dist.get(res_graph.head(e))==dist.get(res_graph.tail(e))+1) { | 
|         |    632 // // 	  typename MutableGraph::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e))); | 
|         |    633 // // 	  original_edge.update(); | 
|         |    634 // // 	  original_edge.set(f, e); | 
|         |    635 // // 	  residual_capacity.update(); | 
|         |    636 // // 	  residual_capacity.set(f, res_graph.free(e)); | 
|         |    637 // // 	}  | 
|         |    638 // //       } | 
|         |    639  | 
|         |    640 // //       bool __augment=true; | 
|         |    641  | 
|         |    642 // //       while (__augment) { | 
|         |    643 // // 	__augment=false; | 
|         |    644 // // 	//computing blocking flow with dfs | 
|         |    645 // // 	typedef typename MutableGraph::NodeMap<bool> BlockingReachedMap; | 
|         |    646 // // 	DfsIterator4< MutableGraph, typename MutableGraph::OutEdgeIt, BlockingReachedMap > dfs(F); | 
|         |    647 // // 	typename MutableGraph::NodeMap<typename MutableGraph::Edge> pred(F); | 
|         |    648 // // 	pred.set(sF, typename MutableGraph::Edge(INVALID)); | 
|         |    649 // // 	//invalid iterators for sources | 
|         |    650  | 
|         |    651 // // 	typename MutableGraph::NodeMap<Num> free(F); | 
|         |    652  | 
|         |    653 // // 	dfs.pushAndSetReached(sF);       | 
|         |    654 // // 	while (!dfs.finished()) { | 
|         |    655 // // 	  ++dfs; | 
|         |    656 // // 	  if (F.valid(typename MutableGraph::OutEdgeIt(dfs))) { | 
|         |    657 // // 	    if (dfs.isBNodeNewlyReached()) { | 
|         |    658 // // 	      typename MutableGraph::Node v=F.aNode(dfs); | 
|         |    659 // // 	      typename MutableGraph::Node w=F.bNode(dfs); | 
|         |    660 // // 	      pred.set(w, dfs); | 
|         |    661 // // 	      if (F.valid(pred.get(v))) { | 
|         |    662 // // 		free.set(w, std::min(free.get(v), residual_capacity.get(dfs))); | 
|         |    663 // // 	      } else { | 
|         |    664 // // 		free.set(w, residual_capacity.get(dfs));  | 
|         |    665 // // 	      } | 
|         |    666 // // 	      if (w==tF) {  | 
|         |    667 // // 		__augment=true;  | 
|         |    668 // // 		_augment=true; | 
|         |    669 // // 		break;  | 
|         |    670 // // 	      } | 
|         |    671 	       | 
|         |    672 // // 	    } else { | 
|         |    673 // // 	      F.erase(typename MutableGraph::OutEdgeIt(dfs)); | 
|         |    674 // // 	    } | 
|         |    675 // // 	  }  | 
|         |    676 // // 	} | 
|         |    677  | 
|         |    678 // // 	if (__augment) { | 
|         |    679 // // 	  typename MutableGraph::Node n=tF; | 
|         |    680 // // 	  Num augment_value=free.get(tF); | 
|         |    681 // // 	  while (F.valid(pred.get(n))) {  | 
|         |    682 // // 	    typename MutableGraph::Edge e=pred.get(n); | 
|         |    683 // // 	    res_graph.augment(original_edge.get(e), augment_value);  | 
|         |    684 // // 	    n=F.tail(e); | 
|         |    685 // // 	    if (residual_capacity.get(e)==augment_value)  | 
|         |    686 // // 	      F.erase(e);  | 
|         |    687 // // 	    else  | 
|         |    688 // // 	      residual_capacity.set(e, residual_capacity.get(e)-augment_value); | 
|         |    689 // // 	  } | 
|         |    690 // // 	} | 
|         |    691 	 | 
|         |    692 // //       } | 
|         |    693              | 
|         |    694 // //       return _augment; | 
|         |    695 // //     } | 
|         |    696 //     bool augmentOnBlockingFlow2() { | 
|         |    697 //       bool _augment=false; | 
|         |    698  | 
|         |    699 //       //typedef ErasingResGraphWrapper<Graph, Num, FlowMap, CapMap> EAugGraph; | 
|         |    700 //       typedef FilterGraphWrapper< ErasingResGraphWrapper<Graph, Num, FlowMap, CapMap> > EAugGraph; | 
|         |    701 //       typedef typename EAugGraph::OutEdgeIt EAugOutEdgeIt; | 
|         |    702 //       typedef typename EAugGraph::Edge EAugEdge; | 
|         |    703  | 
|         |    704 //       EAugGraph res_graph(*G, *flow, *capacity); | 
|         |    705  | 
|         |    706 //       //typedef typename EAugGraph::NodeMap<bool> ReachedMap; | 
|         |    707 //       BfsIterator<  | 
|         |    708 // 	ErasingResGraphWrapper<Graph, Num, FlowMap, CapMap>,  | 
|         |    709 // 	/*typename ErasingResGraphWrapper<Graph, Num, FlowMap, CapMap>::OutEdgeIt,*/  | 
|         |    710 // 	ErasingResGraphWrapper<Graph, Num, FlowMap, CapMap>::NodeMap<bool> > bfs(res_graph); | 
|         |    711  | 
|         |    712  | 
|         |    713 //       //typename AugGraph::NodeMap<AugEdge> pred(res_graph);  | 
|         |    714 //       for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) { | 
|         |    715 // 	if (S->get(s)) { | 
|         |    716 // 	  Num u=0; | 
|         |    717 // 	  for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e)) | 
|         |    718 // 	    u+=flow->get(e); | 
|         |    719 // 	  if (u<1) { | 
|         |    720 // 	    bfs.pushAndSetReached(s); | 
|         |    721 // 	    //pred.set(s, AugEdge(INVALID)); | 
|         |    722 // 	  } | 
|         |    723 // 	} | 
|         |    724 //       } | 
|         |    725  | 
|         |    726        | 
|         |    727 //       //bfs.pushAndSetReached(s); | 
|         |    728  | 
|         |    729 //       typename ErasingResGraphWrapper<Graph, Num, FlowMap, CapMap>:: | 
|         |    730 // 	NodeMap<int>& dist=res_graph.dist; | 
|         |    731  | 
|         |    732 //       while ( !bfs.finished() ) { | 
|         |    733 // 	typename ErasingResGraphWrapper<Graph, Num, FlowMap, CapMap>::OutEdgeIt e=bfs; | 
|         |    734 // 	if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) { | 
|         |    735 // 	  dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1); | 
|         |    736 // 	} | 
|         |    737 // 	++bfs;	 | 
|         |    738 //       } //computing distances from s in the residual graph | 
|         |    739  | 
|         |    740 //       bool __augment=true; | 
|         |    741  | 
|         |    742 //       while (__augment) { | 
|         |    743  | 
|         |    744 // 	__augment=false; | 
|         |    745 // 	//computing blocking flow with dfs | 
|         |    746 // 	typedef typename EAugGraph::NodeMap<bool> BlockingReachedMap; | 
|         |    747 // 	DfsIterator< EAugGraph/*, EAugOutEdgeIt*/, BlockingReachedMap >  | 
|         |    748 // 	  dfs(res_graph); | 
|         |    749 // 	typename EAugGraph::NodeMap<EAugEdge> pred(res_graph, INVALID);  | 
|         |    750 // 	//pred.set(s, EAugEdge(INVALID)); | 
|         |    751 // 	//invalid iterators for sources | 
|         |    752  | 
|         |    753 // 	typename EAugGraph::NodeMap<Num> free(res_graph); | 
|         |    754  | 
|         |    755  | 
|         |    756 // 	//typename AugGraph::NodeMap<AugEdge> pred(res_graph);  | 
|         |    757 //       for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) { | 
|         |    758 // 	if (S->get(s)) { | 
|         |    759 // 	  Num u=0; | 
|         |    760 // 	  for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e)) | 
|         |    761 // 	    u+=flow->get(e); | 
|         |    762 // 	  if (u<1) { | 
|         |    763 // 	    dfs.pushAndSetReached(s); | 
|         |    764 // 	    //pred.set(s, AugEdge(INVALID)); | 
|         |    765 // 	  } | 
|         |    766 // 	} | 
|         |    767 //       } | 
|         |    768  | 
|         |    769  | 
|         |    770  | 
|         |    771 //       //dfs.pushAndSetReached(s); | 
|         |    772 //       typename EAugGraph::Node n; | 
|         |    773 // 	while (!dfs.finished()) { | 
|         |    774 // 	  ++dfs; | 
|         |    775 // 	  if (res_graph.valid(EAugOutEdgeIt(dfs))) {  | 
|         |    776 // 	    if (dfs.isBNodeNewlyReached()) { | 
|         |    777 	   | 
|         |    778 // 	      typename EAugGraph::Node v=res_graph.aNode(dfs); | 
|         |    779 // 	      typename EAugGraph::Node w=res_graph.bNode(dfs); | 
|         |    780  | 
|         |    781 // 	      pred.set(w, EAugOutEdgeIt(dfs)); | 
|         |    782 // 	      if (res_graph.valid(pred.get(v))) { | 
|         |    783 // 		free.set(w, std::min(free.get(v), res_graph.free(dfs))); | 
|         |    784 // 	      } else { | 
|         |    785 // 		free.set(w, res_graph.free(dfs));  | 
|         |    786 // 	      } | 
|         |    787 	      | 
|         |    788 // 	      n=w; | 
|         |    789 // 	      if (T->get(w)) { | 
|         |    790 // 		Num u=0; | 
|         |    791 // 		for(InEdgeIt f=G->template first<InEdgeIt>(n); G->valid(f); G->next(f)) | 
|         |    792 // 		  u+=flow->get(f); | 
|         |    793 // 		if (u<1) { | 
|         |    794 // 		  __augment=true;  | 
|         |    795 // 		  _augment=true; | 
|         |    796 // 		  break;  | 
|         |    797 // 		} | 
|         |    798 // 	      } | 
|         |    799 // 	    } else { | 
|         |    800 // 	      res_graph.erase(dfs); | 
|         |    801 // 	    } | 
|         |    802 // 	  }  | 
|         |    803  | 
|         |    804 // 	} | 
|         |    805  | 
|         |    806 // 	if (__augment) { | 
|         |    807 // 	  // typename EAugGraph::Node n=t; | 
|         |    808 // 	  Num augment_value=free.get(n); | 
|         |    809 // 	  while (res_graph.valid(pred.get(n))) {  | 
|         |    810 // 	    EAugEdge e=pred.get(n); | 
|         |    811 // 	    res_graph.augment(e, augment_value); | 
|         |    812 // 	    n=res_graph.tail(e); | 
|         |    813 // 	    if (res_graph.free(e)==0) | 
|         |    814 // 	      res_graph.erase(e); | 
|         |    815 // 	  } | 
|         |    816 // 	} | 
|         |    817        | 
|         |    818 //       } | 
|         |    819              | 
|         |    820 //       return _augment; | 
|         |    821 //     } | 
|         |    822 //     void run() { | 
|         |    823 //       //int num_of_augmentations=0; | 
|         |    824 //       while (augmentOnShortestPath()) {  | 
|         |    825 // 	//while (augmentOnBlockingFlow<MutableGraph>()) {  | 
|         |    826 // 	//std::cout << ++num_of_augmentations << " "; | 
|         |    827 // 	//std::cout<<std::endl; | 
|         |    828 //       }  | 
|         |    829 //     } | 
|         |    830 // //     template<typename MutableGraph> void run() { | 
|         |    831 // //       //int num_of_augmentations=0; | 
|         |    832 // //       //while (augmentOnShortestPath()) {  | 
|         |    833 // // 	while (augmentOnBlockingFlow<MutableGraph>()) {  | 
|         |    834 // // 	//std::cout << ++num_of_augmentations << " "; | 
|         |    835 // // 	//std::cout<<std::endl; | 
|         |    836 // //       }  | 
|         |    837 // //     }  | 
|         |    838 //     Num flowValue() {  | 
|         |    839 //       Num a=0; | 
|         |    840 //       EdgeIt e; | 
|         |    841 //       for(G->/*getF*/first(e); G->valid(e); G->next(e)) { | 
|         |    842 // 	a+=flow->get(e); | 
|         |    843 //       } | 
|         |    844 //       return a; | 
|         |    845 //     } | 
|         |    846 //   }; | 
|         |    847  | 
|         |    848  | 
|         |    849  | 
|         |    850  | 
|         |    851  | 
|         |    852    | 
|         |    853 // //   template <typename Graph, typename Num, typename FlowMap, typename CapMap> | 
|         |    854 // //   class MaxFlow2 { | 
|         |    855 // //   public: | 
|         |    856 // //     typedef typename Graph::Node Node; | 
|         |    857 // //     typedef typename Graph::Edge Edge; | 
|         |    858 // //     typedef typename Graph::EdgeIt EdgeIt; | 
|         |    859 // //     typedef typename Graph::OutEdgeIt OutEdgeIt; | 
|         |    860 // //     typedef typename Graph::InEdgeIt InEdgeIt; | 
|         |    861 // //   private: | 
|         |    862 // //     const Graph& G; | 
|         |    863 // //     std::list<Node>& S; | 
|         |    864 // //     std::list<Node>& T; | 
|         |    865 // //     FlowMap& flow; | 
|         |    866 // //     const CapMap& capacity; | 
|         |    867 // //     typedef ResGraphWrapper<Graph, Num, FlowMap, CapMap > AugGraph; | 
|         |    868 // //     typedef typename AugGraph::OutEdgeIt AugOutEdgeIt; | 
|         |    869 // //     typedef typename AugGraph::Edge AugEdge; | 
|         |    870 // //     typename Graph::NodeMap<bool> SMap; | 
|         |    871 // //     typename Graph::NodeMap<bool> TMap; | 
|         |    872 // //   public: | 
|         |    873 // //     MaxFlow2(const Graph& _G, std::list<Node>& _S, std::list<Node>& _T, FlowMap& _flow, const CapMap& _capacity) : G(_G), S(_S), T(_T), flow(_flow), capacity(_capacity), SMap(_G), TMap(_G) {  | 
|         |    874 // //       for(typename std::list<Node>::const_iterator i=S.begin();  | 
|         |    875 // // 	  i!=S.end(); ++i) {  | 
|         |    876 // // 	SMap.set(*i, true);  | 
|         |    877 // //       } | 
|         |    878 // //       for (typename std::list<Node>::const_iterator i=T.begin();  | 
|         |    879 // // 	   i!=T.end(); ++i) {  | 
|         |    880 // // 	TMap.set(*i, true);  | 
|         |    881 // //       } | 
|         |    882 // //     } | 
|         |    883 // //     bool augment() { | 
|         |    884 // //       AugGraph res_graph(G, flow, capacity); | 
|         |    885 // //       bool _augment=false; | 
|         |    886 // //       Node reached_t_node; | 
|         |    887        | 
|         |    888 // //       typedef typename AugGraph::NodeMap<bool> ReachedMap; | 
|         |    889 // //       BfsIterator4< AugGraph, AugOutEdgeIt, ReachedMap > bfs(res_graph); | 
|         |    890 // //       for(typename std::list<Node>::const_iterator i=S.begin();  | 
|         |    891 // // 	  i!=S.end(); ++i) { | 
|         |    892 // // 	bfs.pushAndSetReached(*i); | 
|         |    893 // //       } | 
|         |    894 // //       //bfs.pushAndSetReached(s); | 
|         |    895 	 | 
|         |    896 // //       typename AugGraph::NodeMap<AugEdge> pred(res_graph);  | 
|         |    897 // //       //filled up with invalid iterators | 
|         |    898        | 
|         |    899 // //       typename AugGraph::NodeMap<Num> free(res_graph); | 
|         |    900 	 | 
|         |    901 // //       //searching for augmenting path | 
|         |    902 // //       while ( !bfs.finished() ) {  | 
|         |    903 // // 	AugOutEdgeIt e=/*AugOutEdgeIt*/(bfs); | 
|         |    904 // // 	if (e.valid() && bfs.isBNodeNewlyReached()) { | 
|         |    905 // // 	  Node v=res_graph.tail(e); | 
|         |    906 // // 	  Node w=res_graph.head(e); | 
|         |    907 // // 	  pred.set(w, e); | 
|         |    908 // // 	  if (pred.get(v).valid()) { | 
|         |    909 // // 	    free.set(w, std::min(free.get(v), e.free())); | 
|         |    910 // // 	  } else { | 
|         |    911 // // 	    free.set(w, e.free());  | 
|         |    912 // // 	  } | 
|         |    913 // // 	  if (TMap.get(res_graph.head(e))) {  | 
|         |    914 // // 	    _augment=true;  | 
|         |    915 // // 	    reached_t_node=res_graph.head(e); | 
|         |    916 // // 	    break;  | 
|         |    917 // // 	  } | 
|         |    918 // // 	} | 
|         |    919 	 | 
|         |    920 // // 	++bfs; | 
|         |    921 // //       } //end of searching augmenting path | 
|         |    922  | 
|         |    923 // //       if (_augment) { | 
|         |    924 // // 	Node n=reached_t_node; | 
|         |    925 // // 	Num augment_value=free.get(reached_t_node); | 
|         |    926 // // 	while (pred.get(n).valid()) {  | 
|         |    927 // // 	  AugEdge e=pred.get(n); | 
|         |    928 // // 	  e.augment(augment_value);  | 
|         |    929 // // 	  n=res_graph.tail(e); | 
|         |    930 // // 	} | 
|         |    931 // //       } | 
|         |    932  | 
|         |    933 // //       return _augment; | 
|         |    934 // //     } | 
|         |    935 // //     void run() { | 
|         |    936 // //       while (augment()) { }  | 
|         |    937 // //     } | 
|         |    938 // //     Num flowValue() {  | 
|         |    939 // //       Num a=0; | 
|         |    940 // //       for(typename std::list<Node>::const_iterator i=S.begin();  | 
|         |    941 // // 	  i!=S.end(); ++i) {  | 
|         |    942 // // 	for(OutEdgeIt e=G.template first<OutEdgeIt>(*i); e.valid(); ++e) { | 
|         |    943 // // 	  a+=flow.get(e); | 
|         |    944 // // 	} | 
|         |    945 // // 	for(InEdgeIt e=G.template first<InEdgeIt>(*i); e.valid(); ++e) { | 
|         |    946 // // 	  a-=flow.get(e); | 
|         |    947 // // 	} | 
|         |    948 // //       } | 
|         |    949 // //       return a; | 
|         |    950 // //     } | 
|         |    951 // //   }; | 
|         |    952  | 
|         |    953  | 
|         |    954 } // namespace hugo | 
|         |    955  | 
|         |    956 #endif //HUGO_EDMONDS_KARP_H |