2 #ifndef HUGO_EDMONDS_KARP_H
3 #define HUGO_EDMONDS_KARP_H
9 #include <bfs_iterator.h>
14 template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
17 typedef typename Graph::Node Node;
18 typedef typename Graph::NodeIt NodeIt;
20 typedef typename Graph::SymEdgeIt OldSymEdgeIt;
23 const CapacityMap& capacity;
25 ResGraph(const Graph& _G, FlowMap& _flow,
26 const CapacityMap& _capacity) :
27 G(_G), flow(_flow), capacity(_capacity) { }
32 friend class OutEdgeIt;
35 friend class ResGraph<Graph, Number, FlowMap, CapacityMap>;
37 const ResGraph<Graph, Number, FlowMap, CapacityMap>* resG;
41 //Edge(const Edge& e) : resG(e.resG), sym(e.sym) { }
43 if (resG->G.aNode(sym)==resG->G.tail(sym)) {
44 return (resG->capacity.get(sym)-resG->flow.get(sym));
46 return (resG->flow.get(sym));
49 bool valid() const { return sym.valid(); }
50 void augment(Number a) const {
51 if (resG->G.aNode(sym)==resG->G.tail(sym)) {
52 resG->flow.set(sym, resG->flow.get(sym)+a);
55 resG->flow.set(sym, resG->flow.get(sym)-a);
61 class OutEdgeIt : public Edge {
62 friend class ResGraph<Graph, Number, FlowMap, CapacityMap>;
65 //OutEdgeIt(const OutEdgeIt& e) { resG=e.resG; sym=e.sym; }
67 OutEdgeIt(const ResGraph<Graph, Number, FlowMap, CapacityMap>& _resG, Node v) {
69 sym=resG->G.template first<OldSymEdgeIt>(v);
70 while( sym.valid() && !(free()>0) ) { ++sym; }
73 OutEdgeIt& operator++() {
75 while( sym.valid() && !(free()>0) ) { ++sym; }
80 void /*getF*/first(OutEdgeIt& e, Node v) const {
81 e=OutEdgeIt(*this, v);
83 void /*getF*/first(NodeIt& v) const { G./*getF*/first(v); }
85 template< typename It >
92 template< typename It >
93 It first(Node v) const {
99 Node tail(Edge e) const { return G.aNode(e.sym); }
100 Node head(Edge e) const { return G.bNode(e.sym); }
102 Node aNode(OutEdgeIt e) const { return G.aNode(e.sym); }
103 Node bNode(OutEdgeIt e) const { return G.bNode(e.sym); }
105 int id(Node v) const { return G.id(v); }
107 template <typename S>
109 typename Graph::NodeMap<S> node_map;
111 NodeMap(const ResGraph<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(_G.G) { }
112 NodeMap(const ResGraph<Graph, Number, FlowMap, CapacityMap>& _G, S a) : node_map(_G.G, a) { }
113 void set(Node nit, S a) { node_map.set(nit, a); }
114 S get(Node nit) const { return node_map.get(nit); }
115 S& operator[](Node nit) { return node_map[nit]; }
116 const S& operator[](Node nit) const { return node_map[nit]; }
122 template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
125 typedef typename Graph::Node Node;
126 typedef typename Graph::NodeIt NodeIt;
128 //typedef typename Graph::SymEdgeIt OldSymEdgeIt;
129 typedef typename Graph::OutEdgeIt OldOutEdgeIt;
130 typedef typename Graph::InEdgeIt OldInEdgeIt;
134 const CapacityMap& capacity;
136 ResGraph2(const Graph& _G, FlowMap& _flow,
137 const CapacityMap& _capacity) :
138 G(_G), flow(_flow), capacity(_capacity) { }
143 friend class OutEdgeIt;
146 friend class ResGraph2<Graph, Number, FlowMap, CapacityMap>;
148 const ResGraph2<Graph, Number, FlowMap, CapacityMap>* resG;
152 bool out_or_in; //true, iff out
154 Edge() : out_or_in(true) { }
155 Number free() const {
157 return (resG->capacity.get(out)-resG->flow.get(out));
159 return (resG->flow.get(in));
163 return out_or_in && out.valid() || in.valid(); }
164 void augment(Number a) const {
166 resG->flow.set(out, resG->flow.get(out)+a);
168 resG->flow.set(in, resG->flow.get(in)-a);
173 class OutEdgeIt : public Edge {
174 friend class ResGraph2<Graph, Number, FlowMap, CapacityMap>;
178 OutEdgeIt(const ResGraph2<Graph, Number, FlowMap, CapacityMap>& _resG, Node v) {
180 out=resG->G.template first<OldOutEdgeIt>(v);
181 while( out.valid() && !(free()>0) ) { ++out; }
184 in=resG->G.template first<OldInEdgeIt>(v);
185 while( in.valid() && !(free()>0) ) { ++in; }
189 OutEdgeIt& operator++() {
191 Node v=resG->G.aNode(out);
193 while( out.valid() && !(free()>0) ) { ++out; }
196 in=resG->G.template first<OldInEdgeIt>(v);
197 while( in.valid() && !(free()>0) ) { ++in; }
201 while( in.valid() && !(free()>0) ) { ++in; }
207 void /*getF*/first(OutEdgeIt& e, Node v) const {
208 e=OutEdgeIt(*this, v);
210 void /*getF*/first(NodeIt& v) const { G./*getF*/first(v); }
212 template< typename It >
219 template< typename It >
220 It first(Node v) const {
226 Node tail(Edge e) const {
227 return ((e.out_or_in) ? G.aNode(e.out) : G.aNode(e.in)); }
228 Node head(Edge e) const {
229 return ((e.out_or_in) ? G.bNode(e.out) : G.bNode(e.in)); }
231 Node aNode(OutEdgeIt e) const {
232 return ((e.out_or_in) ? G.aNode(e.out) : G.aNode(e.in)); }
233 Node bNode(OutEdgeIt e) const {
234 return ((e.out_or_in) ? G.bNode(e.out) : G.bNode(e.in)); }
236 int id(Node v) const { return G.id(v); }
238 template <typename S>
240 typename Graph::NodeMap<S> node_map;
242 NodeMap(const ResGraph2<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(_G.G) { }
243 NodeMap(const ResGraph2<Graph, Number, FlowMap, CapacityMap>& _G, S a) : node_map(_G.G, a) { }
244 void set(Node nit, S a) { node_map.set(nit, a); }
245 S get(Node nit) const { return node_map.get(nit); }
250 template <typename GraphWrapper, typename Number, typename FlowMap, typename CapacityMap>
253 typedef GraphWrapper GW;
254 typedef typename GW::Node Node;
255 typedef typename GW::Edge Edge;
256 typedef typename GW::EdgeIt EdgeIt;
257 typedef typename GW::OutEdgeIt OutEdgeIt;
258 typedef typename GW::InEdgeIt InEdgeIt;
264 const CapacityMap* capacity;
265 typedef ResGraphWrapper<GW, Number, FlowMap, CapacityMap > ResGW;
266 typedef typename ResGW::OutEdgeIt ResGWOutEdgeIt;
267 typedef typename ResGW::Edge ResGWEdge;
270 MaxFlow(const GW& _gw, Node _s, Node _t, FlowMap& _flow, const CapacityMap& _capacity) :
271 gw(_gw), s(_s), t(_t), flow(&_flow), capacity(&_capacity) { }
273 bool augmentOnShortestPath() {
274 ResGW res_graph(gw, *flow, *capacity);
277 typedef typename ResGW::NodeMap<bool> ReachedMap;
278 BfsIterator5< ResGW, ReachedMap > bfs(res_graph);
279 bfs.pushAndSetReached(s);
281 typename ResGW::NodeMap<ResGWEdge> pred(res_graph);
282 pred.set(s, INVALID);
284 typename ResGW::NodeMap<Number> free(res_graph);
286 //searching for augmenting path
287 while ( !bfs.finished() ) {
288 ResGWOutEdgeIt e=bfs;
289 if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
290 Node v=res_graph.tail(e);
291 Node w=res_graph.head(e);
293 if (res_graph.valid(pred.get(v))) {
294 free.set(w, std::min(free.get(v), res_graph.resCap(e)));
296 free.set(w, res_graph.resCap(e));
298 if (res_graph.head(e)==t) { _augment=true; break; }
302 } //end of searching augmenting path
306 Number augment_value=free.get(t);
307 while (res_graph.valid(pred.get(n))) {
308 ResGWEdge e=pred.get(n);
309 res_graph.augment(e, augment_value);
317 template<typename MapGraphWrapper>
321 typename MapGraphWrapper::NodeMap<int> dist;
323 DistanceMap(MapGraphWrapper& _gw) : gw(_gw), dist(_gw, _gw.nodeNum()) { }
324 void set(const typename MapGraphWrapper::Node& n, int a) { dist[n]=a; }
325 int get(const typename MapGraphWrapper::Node& n) const { return dist[n]; }
326 bool get(const typename MapGraphWrapper::Edge& e) const {
327 return (dist.get(gw.tail(e))<dist.get(gw.head(e)));
331 template<typename MutableGraph> bool augmentOnBlockingFlow() {
332 typedef MutableGraph MG;
335 ResGW res_graph(gw, *flow, *capacity);
337 typedef typename ResGW::NodeMap<bool> ReachedMap;
338 BfsIterator5< ResGW, ReachedMap > bfs(res_graph);
340 bfs.pushAndSetReached(s);
341 //typename ResGW::NodeMap<int> dist(res_graph); //filled up with 0's
342 DistanceMap<ResGW> dist(res_graph);
343 while ( !bfs.finished() ) {
344 ResGWOutEdgeIt e=bfs;
345 if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
346 dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
349 } //computing distances from s in the residual graph
352 typedef SubGraphWrapper<ResGW, DistanceMap<ResGW> > FilterResGW;
353 FilterResGW filter_res_graph(res_graph, dist);
354 typename ResGW::NodeMap<typename MG::Node> res_graph_to_F(res_graph);
356 typename ResGW::NodeIt n;
357 for(res_graph.first(n); res_graph.valid(n); res_graph.next(n)) {
358 res_graph_to_F.set(n, F.addNode());
362 typename MG::Node sF=res_graph_to_F.get(s);
363 typename MG::Node tF=res_graph_to_F.get(t);
364 typename MG::EdgeMap<ResGWEdge> original_edge(F);
365 typename MG::EdgeMap<Number> residual_capacity(F);
367 //Making F to the graph containing the edges of the residual graph
368 //which are in some shortest paths
370 typename FilterResGW::EdgeIt e;
371 for(filter_res_graph.first(e); filter_res_graph.valid(e); filter_res_graph.next(e)) {
372 //if (dist.get(res_graph.head(e))==dist.get(res_graph.tail(e))+1) {
373 typename MG::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
374 original_edge.update();
375 original_edge.set(f, e);
376 residual_capacity.update();
377 residual_capacity.set(f, res_graph.resCap(e));
386 //computing blocking flow with dfs
387 typedef typename TrivGraphWrapper<MG>::NodeMap<bool> BlockingReachedMap;
388 DfsIterator5< TrivGraphWrapper<MG>, BlockingReachedMap > dfs(F);
389 typename MG::NodeMap<typename MG::Edge> pred(F);
390 pred.set(sF, INVALID);
391 //invalid iterators for sources
393 typename MG::NodeMap<Number> free(F);
395 dfs.pushAndSetReached(sF);
396 while (!dfs.finished()) {
398 if (F.valid(/*typename MG::OutEdgeIt*/(dfs))) {
399 if (dfs.isBNodeNewlyReached()) {
400 typename MG::Node v=F.aNode(dfs);
401 typename MG::Node w=F.bNode(dfs);
403 if (F.valid(pred.get(v))) {
404 free.set(w, std::min(free.get(v), residual_capacity.get(dfs)));
406 free.set(w, residual_capacity.get(dfs));
415 F.erase(/*typename MG::OutEdgeIt*/(dfs));
421 typename MG::Node n=tF;
422 Number augment_value=free.get(tF);
423 while (F.valid(pred.get(n))) {
424 typename MG::Edge e=pred.get(n);
425 res_graph.augment(original_edge.get(e), augment_value);
427 if (residual_capacity.get(e)==augment_value)
430 residual_capacity.set(e, residual_capacity.get(e)-augment_value);
439 template<typename MutableGraph> bool augmentOnBlockingFlow1() {
440 typedef MutableGraph MG;
443 ResGW res_graph(gw, *flow, *capacity);
445 //bfs for distances on the residual graph
446 typedef typename ResGW::NodeMap<bool> ReachedMap;
447 BfsIterator5< ResGW, ReachedMap > bfs(res_graph);
448 bfs.pushAndSetReached(s);
449 typename ResGW::NodeMap<int> dist(res_graph); //filled up with 0's
451 //F will contain the physical copy of the residual graph
452 //with the set of edges which are on shortest paths
454 typename ResGW::NodeMap<typename MG::Node> res_graph_to_F(res_graph);
456 typename ResGW::NodeIt n;
457 for(res_graph.first(n); res_graph.valid(n); res_graph.next(n)) {
458 res_graph_to_F.set(n, F.addNode());
462 typename MG::Node sF=res_graph_to_F.get(s);
463 typename MG::Node tF=res_graph_to_F.get(t);
464 typename MG::EdgeMap<ResGWEdge> original_edge(F);
465 typename MG::EdgeMap<Number> residual_capacity(F);
467 while ( !bfs.finished() ) {
468 ResGWOutEdgeIt e=bfs;
469 if (res_graph.valid(e)) {
470 if (bfs.isBNodeNewlyReached()) {
471 dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
472 typename MG::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
473 original_edge.update();
474 original_edge.set(f, e);
475 residual_capacity.update();
476 residual_capacity.set(f, res_graph.resCap(e));
478 if (dist.get(res_graph.head(e))==(dist.get(res_graph.tail(e))+1)) {
479 typename MG::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
480 original_edge.update();
481 original_edge.set(f, e);
482 residual_capacity.update();
483 residual_capacity.set(f, res_graph.resCap(e));
488 } //computing distances from s in the residual graph
494 //computing blocking flow with dfs
495 typedef typename TrivGraphWrapper<MG>::NodeMap<bool> BlockingReachedMap;
496 DfsIterator5< TrivGraphWrapper<MG>, BlockingReachedMap > dfs(F);
497 typename MG::NodeMap<typename MG::Edge> pred(F);
498 pred.set(sF, INVALID);
499 //invalid iterators for sources
501 typename MG::NodeMap<Number> free(F);
503 dfs.pushAndSetReached(sF);
504 while (!dfs.finished()) {
506 if (F.valid(/*typename MG::OutEdgeIt*/(dfs))) {
507 if (dfs.isBNodeNewlyReached()) {
508 typename MG::Node v=F.aNode(dfs);
509 typename MG::Node w=F.bNode(dfs);
511 if (F.valid(pred.get(v))) {
512 free.set(w, std::min(free.get(v), residual_capacity.get(dfs)));
514 free.set(w, residual_capacity.get(dfs));
523 F.erase(/*typename MG::OutEdgeIt*/(dfs));
529 typename MG::Node n=tF;
530 Number augment_value=free.get(tF);
531 while (F.valid(pred.get(n))) {
532 typename MG::Edge e=pred.get(n);
533 res_graph.augment(original_edge.get(e), augment_value);
535 if (residual_capacity.get(e)==augment_value)
538 residual_capacity.set(e, residual_capacity.get(e)-augment_value);
547 bool augmentOnBlockingFlow2() {
550 ResGW res_graph(gw, *flow, *capacity);
552 typedef typename ResGW::NodeMap<bool> ReachedMap;
553 BfsIterator5< ResGW, ReachedMap > bfs(res_graph);
555 bfs.pushAndSetReached(s);
556 DistanceMap<ResGW> dist(res_graph);
557 while ( !bfs.finished() ) {
558 ResGWOutEdgeIt e=bfs;
559 if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
560 dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
563 } //computing distances from s in the residual graph
565 //Subgraph containing the edges on some shortest paths
566 typedef SubGraphWrapper<ResGW, DistanceMap<ResGW> > FilterResGW;
567 FilterResGW filter_res_graph(res_graph, dist);
569 //Subgraph, which is able to delete edges which are already
571 typename FilterResGW::NodeMap<typename FilterResGW::OutEdgeIt>
572 first_out_edges(filter_res_graph);
573 typename FilterResGW::NodeIt v;
574 for(filter_res_graph.first(v); filter_res_graph.valid(v);
575 filter_res_graph.next(v))
577 typename FilterResGW::OutEdgeIt e;
578 filter_res_graph.first(e, v);
579 first_out_edges.set(v, e);
581 typedef ErasingFirstGraphWrapper<FilterResGW, typename FilterResGW::
582 NodeMap<typename FilterResGW::OutEdgeIt> > ErasingResGW;
583 ErasingResGW erasing_res_graph(filter_res_graph, first_out_edges);
590 //computing blocking flow with dfs
591 typedef typename ErasingResGW::NodeMap<bool> BlockingReachedMap;
592 DfsIterator5< ErasingResGW, BlockingReachedMap >
593 dfs(erasing_res_graph);
594 typename ErasingResGW::NodeMap<typename ErasingResGW::OutEdgeIt>
595 pred(erasing_res_graph);
596 pred.set(s, INVALID);
597 //invalid iterators for sources
599 typename ErasingResGW::NodeMap<Number> free(erasing_res_graph);
601 dfs.pushAndSetReached(s);
602 while (!dfs.finished()) {
604 if (erasing_res_graph.valid(
605 /*typename ErasingResGW::OutEdgeIt*/(dfs)))
607 if (dfs.isBNodeNewlyReached()) {
609 typename ErasingResGW::Node v=erasing_res_graph.aNode(dfs);
610 typename ErasingResGW::Node w=erasing_res_graph.bNode(dfs);
612 pred.set(w, /*typename ErasingResGW::OutEdgeIt*/(dfs));
613 if (erasing_res_graph.valid(pred.get(v))) {
614 free.set(w, std::min(free.get(v), res_graph.resCap(dfs)));
616 free.set(w, res_graph.resCap(dfs));
625 erasing_res_graph.erase(dfs);
631 typename ErasingResGW::Node n=t;
632 Number augment_value=free.get(n);
633 while (erasing_res_graph.valid(pred.get(n))) {
634 typename ErasingResGW::OutEdgeIt e=pred.get(n);
635 res_graph.augment(e, augment_value);
636 n=erasing_res_graph.tail(e);
637 if (res_graph.resCap(e)==0)
638 erasing_res_graph.erase(e);
642 } //while (__augment)
647 // bool augmentOnBlockingFlow2() {
648 // bool _augment=false;
650 // //typedef ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> EAugGraph;
651 // typedef FilterGraphWrapper< ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> > EAugGraph;
652 // typedef typename EAugGraph::OutEdgeIt EAugOutEdgeIt;
653 // typedef typename EAugGraph::Edge EAugEdge;
655 // EAugGraph res_graph(*G, *flow, *capacity);
657 // //typedef typename EAugGraph::NodeMap<bool> ReachedMap;
659 // ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>,
660 // /*typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt,*/
661 // ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<bool> > bfs(res_graph);
663 // bfs.pushAndSetReached(s);
665 // typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::
666 // NodeMap<int>& dist=res_graph.dist;
668 // while ( !bfs.finished() ) {
669 // typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt e=bfs;
670 // if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
671 // dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
674 // } //computing distances from s in the residual graph
676 // bool __augment=true;
678 // while (__augment) {
681 // //computing blocking flow with dfs
682 // typedef typename EAugGraph::NodeMap<bool> BlockingReachedMap;
683 // DfsIterator5< EAugGraph/*, EAugOutEdgeIt*/, BlockingReachedMap >
685 // typename EAugGraph::NodeMap<EAugEdge> pred(res_graph);
686 // pred.set(s, EAugEdge(INVALID));
687 // //invalid iterators for sources
689 // typename EAugGraph::NodeMap<Number> free(res_graph);
691 // dfs.pushAndSetReached(s);
692 // while (!dfs.finished()) {
694 // if (res_graph.valid(EAugOutEdgeIt(dfs))) {
695 // if (dfs.isBNodeNewlyReached()) {
697 // typename EAugGraph::Node v=res_graph.aNode(dfs);
698 // typename EAugGraph::Node w=res_graph.bNode(dfs);
700 // pred.set(w, EAugOutEdgeIt(dfs));
701 // if (res_graph.valid(pred.get(v))) {
702 // free.set(w, std::min(free.get(v), res_graph.free(dfs)));
704 // free.set(w, res_graph.free(dfs));
713 // res_graph.erase(dfs);
720 // typename EAugGraph::Node n=t;
721 // Number augment_value=free.get(t);
722 // while (res_graph.valid(pred.get(n))) {
723 // EAugEdge e=pred.get(n);
724 // res_graph.augment(e, augment_value);
725 // n=res_graph.tail(e);
726 // if (res_graph.free(e)==0)
727 // res_graph.erase(e);
737 //int num_of_augmentations=0;
738 while (augmentOnShortestPath()) {
739 //while (augmentOnBlockingFlow<MutableGraph>()) {
740 //std::cout << ++num_of_augmentations << " ";
741 //std::cout<<std::endl;
745 template<typename MutableGraph> void run() {
746 //int num_of_augmentations=0;
747 //while (augmentOnShortestPath()) {
748 while (augmentOnBlockingFlow<MutableGraph>()) {
749 //std::cout << ++num_of_augmentations << " ";
750 //std::cout<<std::endl;
757 for(gw.first(e, s); gw.valid(e); gw.next(e)) {
766 // template <typename Graph, typename Number, typename FlowMap, typename CapacityMap>
767 // class MaxMatching {
769 // typedef typename Graph::Node Node;
770 // typedef typename Graph::NodeIt NodeIt;
771 // typedef typename Graph::Edge Edge;
772 // typedef typename Graph::EdgeIt EdgeIt;
773 // typedef typename Graph::OutEdgeIt OutEdgeIt;
774 // typedef typename Graph::InEdgeIt InEdgeIt;
776 // typedef typename Graph::NodeMap<bool> SMap;
777 // typedef typename Graph::NodeMap<bool> TMap;
785 // const CapacityMap* capacity;
786 // typedef ResGraphWrapper<Graph, Number, FlowMap, CapacityMap > AugGraph;
787 // typedef typename AugGraph::OutEdgeIt AugOutEdgeIt;
788 // typedef typename AugGraph::Edge AugEdge;
789 // typename Graph::NodeMap<int> used; //0
792 // MaxMatching(const Graph& _G, SMap& _S, TMap& _T, FlowMap& _flow, const CapacityMap& _capacity) :
793 // G(&_G), S(&_S), T(&_T), flow(&_flow), capacity(&_capacity), used(_G) { }
794 // bool augmentOnShortestPath() {
795 // AugGraph res_graph(*G, *flow, *capacity);
796 // bool _augment=false;
798 // typedef typename AugGraph::NodeMap<bool> ReachedMap;
799 // BfsIterator5< AugGraph, /*AugOutEdgeIt,*/ ReachedMap > bfs(res_graph);
800 // typename AugGraph::NodeMap<AugEdge> pred(res_graph);
801 // for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
802 // if ((S->get(s)) && (used.get(s)<1) ) {
804 // //for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
805 // //u+=flow->get(e);
807 // bfs.pushAndSetReached(s);
808 // pred.set(s, AugEdge(INVALID));
813 // typename AugGraph::NodeMap<Number> free(res_graph);
816 // //searching for augmenting path
817 // while ( !bfs.finished() ) {
818 // AugOutEdgeIt e=bfs;
819 // if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
820 // Node v=res_graph.tail(e);
821 // Node w=res_graph.head(e);
823 // if (res_graph.valid(pred.get(v))) {
824 // free.set(w, std::min(free.get(v), res_graph.free(e)));
826 // free.set(w, res_graph.free(e));
828 // n=res_graph.head(e);
829 // if (T->get(n) && (used.get(n)<1) ) {
831 // //for(InEdgeIt f=G->template first<InEdgeIt>(n); G->valid(f); G->next(f))
832 // //u+=flow->get(f);
841 // } //end of searching augmenting path
845 // used.set(n, 1); //mind2 vegen jav
846 // Number augment_value=free.get(n);
847 // while (res_graph.valid(pred.get(n))) {
848 // AugEdge e=pred.get(n);
849 // res_graph.augment(e, augment_value);
850 // n=res_graph.tail(e);
852 // used.set(n, 1); //mind2 vegen jav
858 // // template<typename MutableGraph> bool augmentOnBlockingFlow() {
859 // // bool _augment=false;
861 // // AugGraph res_graph(*G, *flow, *capacity);
863 // // typedef typename AugGraph::NodeMap<bool> ReachedMap;
864 // // BfsIterator4< AugGraph, AugOutEdgeIt, ReachedMap > bfs(res_graph);
870 // // //typename AugGraph::NodeMap<AugEdge> pred(res_graph);
871 // // for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
872 // // if (S->get(s)) {
874 // // for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
875 // // u+=flow->get(e);
877 // // bfs.pushAndSetReached(s);
878 // // //pred.set(s, AugEdge(INVALID));
886 // // //bfs.pushAndSetReached(s);
887 // // typename AugGraph::NodeMap<int> dist(res_graph); //filled up with 0's
888 // // while ( !bfs.finished() ) {
889 // // AugOutEdgeIt e=bfs;
890 // // if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
891 // // dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
895 // // } //computing distances from s in the residual graph
897 // // MutableGraph F;
898 // // typename AugGraph::NodeMap<typename MutableGraph::Node>
899 // // res_graph_to_F(res_graph);
900 // // for(typename AugGraph::NodeIt n=res_graph.template first<typename AugGraph::NodeIt>(); res_graph.valid(n); res_graph.next(n)) {
901 // // res_graph_to_F.set(n, F.addNode());
904 // // typename MutableGraph::Node sF=res_graph_to_F.get(s);
905 // // typename MutableGraph::Node tF=res_graph_to_F.get(t);
907 // // typename MutableGraph::EdgeMap<AugEdge> original_edge(F);
908 // // typename MutableGraph::EdgeMap<Number> residual_capacity(F);
910 // // //Making F to the graph containing the edges of the residual graph
911 // // //which are in some shortest paths
912 // // for(typename AugGraph::EdgeIt e=res_graph.template first<typename AugGraph::EdgeIt>(); res_graph.valid(e); res_graph.next(e)) {
913 // // if (dist.get(res_graph.head(e))==dist.get(res_graph.tail(e))+1) {
914 // // typename MutableGraph::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
915 // // original_edge.update();
916 // // original_edge.set(f, e);
917 // // residual_capacity.update();
918 // // residual_capacity.set(f, res_graph.free(e));
922 // // bool __augment=true;
924 // // while (__augment) {
925 // // __augment=false;
926 // // //computing blocking flow with dfs
927 // // typedef typename MutableGraph::NodeMap<bool> BlockingReachedMap;
928 // // DfsIterator4< MutableGraph, typename MutableGraph::OutEdgeIt, BlockingReachedMap > dfs(F);
929 // // typename MutableGraph::NodeMap<typename MutableGraph::Edge> pred(F);
930 // // pred.set(sF, typename MutableGraph::Edge(INVALID));
931 // // //invalid iterators for sources
933 // // typename MutableGraph::NodeMap<Number> free(F);
935 // // dfs.pushAndSetReached(sF);
936 // // while (!dfs.finished()) {
938 // // if (F.valid(typename MutableGraph::OutEdgeIt(dfs))) {
939 // // if (dfs.isBNodeNewlyReached()) {
940 // // typename MutableGraph::Node v=F.aNode(dfs);
941 // // typename MutableGraph::Node w=F.bNode(dfs);
942 // // pred.set(w, dfs);
943 // // if (F.valid(pred.get(v))) {
944 // // free.set(w, std::min(free.get(v), residual_capacity.get(dfs)));
946 // // free.set(w, residual_capacity.get(dfs));
949 // // __augment=true;
955 // // F.erase(typename MutableGraph::OutEdgeIt(dfs));
960 // // if (__augment) {
961 // // typename MutableGraph::Node n=tF;
962 // // Number augment_value=free.get(tF);
963 // // while (F.valid(pred.get(n))) {
964 // // typename MutableGraph::Edge e=pred.get(n);
965 // // res_graph.augment(original_edge.get(e), augment_value);
967 // // if (residual_capacity.get(e)==augment_value)
970 // // residual_capacity.set(e, residual_capacity.get(e)-augment_value);
976 // // return _augment;
978 // bool augmentOnBlockingFlow2() {
979 // bool _augment=false;
981 // //typedef ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> EAugGraph;
982 // typedef FilterGraphWrapper< ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> > EAugGraph;
983 // typedef typename EAugGraph::OutEdgeIt EAugOutEdgeIt;
984 // typedef typename EAugGraph::Edge EAugEdge;
986 // EAugGraph res_graph(*G, *flow, *capacity);
988 // //typedef typename EAugGraph::NodeMap<bool> ReachedMap;
990 // ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>,
991 // /*typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt,*/
992 // ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<bool> > bfs(res_graph);
995 // //typename AugGraph::NodeMap<AugEdge> pred(res_graph);
996 // for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
999 // for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
1002 // bfs.pushAndSetReached(s);
1003 // //pred.set(s, AugEdge(INVALID));
1009 // //bfs.pushAndSetReached(s);
1011 // typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::
1012 // NodeMap<int>& dist=res_graph.dist;
1014 // while ( !bfs.finished() ) {
1015 // typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt e=bfs;
1016 // if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
1017 // dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
1020 // } //computing distances from s in the residual graph
1022 // bool __augment=true;
1024 // while (__augment) {
1027 // //computing blocking flow with dfs
1028 // typedef typename EAugGraph::NodeMap<bool> BlockingReachedMap;
1029 // DfsIterator5< EAugGraph/*, EAugOutEdgeIt*/, BlockingReachedMap >
1031 // typename EAugGraph::NodeMap<EAugEdge> pred(res_graph, INVALID);
1032 // //pred.set(s, EAugEdge(INVALID));
1033 // //invalid iterators for sources
1035 // typename EAugGraph::NodeMap<Number> free(res_graph);
1038 // //typename AugGraph::NodeMap<AugEdge> pred(res_graph);
1039 // for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
1042 // for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
1045 // dfs.pushAndSetReached(s);
1046 // //pred.set(s, AugEdge(INVALID));
1053 // //dfs.pushAndSetReached(s);
1054 // typename EAugGraph::Node n;
1055 // while (!dfs.finished()) {
1057 // if (res_graph.valid(EAugOutEdgeIt(dfs))) {
1058 // if (dfs.isBNodeNewlyReached()) {
1060 // typename EAugGraph::Node v=res_graph.aNode(dfs);
1061 // typename EAugGraph::Node w=res_graph.bNode(dfs);
1063 // pred.set(w, EAugOutEdgeIt(dfs));
1064 // if (res_graph.valid(pred.get(v))) {
1065 // free.set(w, std::min(free.get(v), res_graph.free(dfs)));
1067 // free.set(w, res_graph.free(dfs));
1073 // for(InEdgeIt f=G->template first<InEdgeIt>(n); G->valid(f); G->next(f))
1082 // res_graph.erase(dfs);
1089 // // typename EAugGraph::Node n=t;
1090 // Number augment_value=free.get(n);
1091 // while (res_graph.valid(pred.get(n))) {
1092 // EAugEdge e=pred.get(n);
1093 // res_graph.augment(e, augment_value);
1094 // n=res_graph.tail(e);
1095 // if (res_graph.free(e)==0)
1096 // res_graph.erase(e);
1105 // //int num_of_augmentations=0;
1106 // while (augmentOnShortestPath()) {
1107 // //while (augmentOnBlockingFlow<MutableGraph>()) {
1108 // //std::cout << ++num_of_augmentations << " ";
1109 // //std::cout<<std::endl;
1112 // // template<typename MutableGraph> void run() {
1113 // // //int num_of_augmentations=0;
1114 // // //while (augmentOnShortestPath()) {
1115 // // while (augmentOnBlockingFlow<MutableGraph>()) {
1116 // // //std::cout << ++num_of_augmentations << " ";
1117 // // //std::cout<<std::endl;
1120 // Number flowValue() {
1123 // for(G->/*getF*/first(e); G->valid(e); G->next(e)) {
1135 // // template <typename Graph, typename Number, typename FlowMap, typename CapacityMap>
1136 // // class MaxFlow2 {
1138 // // typedef typename Graph::Node Node;
1139 // // typedef typename Graph::Edge Edge;
1140 // // typedef typename Graph::EdgeIt EdgeIt;
1141 // // typedef typename Graph::OutEdgeIt OutEdgeIt;
1142 // // typedef typename Graph::InEdgeIt InEdgeIt;
1144 // // const Graph& G;
1145 // // std::list<Node>& S;
1146 // // std::list<Node>& T;
1147 // // FlowMap& flow;
1148 // // const CapacityMap& capacity;
1149 // // typedef ResGraphWrapper<Graph, Number, FlowMap, CapacityMap > AugGraph;
1150 // // typedef typename AugGraph::OutEdgeIt AugOutEdgeIt;
1151 // // typedef typename AugGraph::Edge AugEdge;
1152 // // typename Graph::NodeMap<bool> SMap;
1153 // // typename Graph::NodeMap<bool> TMap;
1155 // // MaxFlow2(const Graph& _G, std::list<Node>& _S, std::list<Node>& _T, FlowMap& _flow, const CapacityMap& _capacity) : G(_G), S(_S), T(_T), flow(_flow), capacity(_capacity), SMap(_G), TMap(_G) {
1156 // // for(typename std::list<Node>::const_iterator i=S.begin();
1157 // // i!=S.end(); ++i) {
1158 // // SMap.set(*i, true);
1160 // // for (typename std::list<Node>::const_iterator i=T.begin();
1161 // // i!=T.end(); ++i) {
1162 // // TMap.set(*i, true);
1165 // // bool augment() {
1166 // // AugGraph res_graph(G, flow, capacity);
1167 // // bool _augment=false;
1168 // // Node reached_t_node;
1170 // // typedef typename AugGraph::NodeMap<bool> ReachedMap;
1171 // // BfsIterator4< AugGraph, AugOutEdgeIt, ReachedMap > bfs(res_graph);
1172 // // for(typename std::list<Node>::const_iterator i=S.begin();
1173 // // i!=S.end(); ++i) {
1174 // // bfs.pushAndSetReached(*i);
1176 // // //bfs.pushAndSetReached(s);
1178 // // typename AugGraph::NodeMap<AugEdge> pred(res_graph);
1179 // // //filled up with invalid iterators
1181 // // typename AugGraph::NodeMap<Number> free(res_graph);
1183 // // //searching for augmenting path
1184 // // while ( !bfs.finished() ) {
1185 // // AugOutEdgeIt e=/*AugOutEdgeIt*/(bfs);
1186 // // if (e.valid() && bfs.isBNodeNewlyReached()) {
1187 // // Node v=res_graph.tail(e);
1188 // // Node w=res_graph.head(e);
1189 // // pred.set(w, e);
1190 // // if (pred.get(v).valid()) {
1191 // // free.set(w, std::min(free.get(v), e.free()));
1193 // // free.set(w, e.free());
1195 // // if (TMap.get(res_graph.head(e))) {
1196 // // _augment=true;
1197 // // reached_t_node=res_graph.head(e);
1203 // // } //end of searching augmenting path
1205 // // if (_augment) {
1206 // // Node n=reached_t_node;
1207 // // Number augment_value=free.get(reached_t_node);
1208 // // while (pred.get(n).valid()) {
1209 // // AugEdge e=pred.get(n);
1210 // // e.augment(augment_value);
1211 // // n=res_graph.tail(e);
1215 // // return _augment;
1218 // // while (augment()) { }
1220 // // Number flowValue() {
1222 // // for(typename std::list<Node>::const_iterator i=S.begin();
1223 // // i!=S.end(); ++i) {
1224 // // for(OutEdgeIt e=G.template first<OutEdgeIt>(*i); e.valid(); ++e) {
1225 // // a+=flow.get(e);
1227 // // for(InEdgeIt e=G.template first<InEdgeIt>(*i); e.valid(); ++e) {
1228 // // a-=flow.get(e);
1238 #endif //HUGO_EDMONDS_KARP_H