.
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 Graph, typename Number, typename FlowMap, typename CapacityMap>
253 typedef typename Graph::Node Node;
254 typedef typename Graph::Edge Edge;
255 typedef typename Graph::EdgeIt EdgeIt;
256 typedef typename Graph::OutEdgeIt OutEdgeIt;
257 typedef typename Graph::InEdgeIt InEdgeIt;
264 const CapacityMap* capacity;
265 typedef ResGraphWrapper<Graph, Number, FlowMap, CapacityMap > AugGraph;
266 typedef typename AugGraph::OutEdgeIt AugOutEdgeIt;
267 typedef typename AugGraph::Edge AugEdge;
270 MaxFlow(const Graph& _G, Node _s, Node _t, FlowMap& _flow, const CapacityMap& _capacity) :
271 G(&_G), s(_s), t(_t), flow(&_flow), capacity(&_capacity) { }
272 bool augmentOnShortestPath() {
273 AugGraph res_graph(*G, *flow, *capacity);
276 typedef typename AugGraph::NodeMap<bool> ReachedMap;
277 BfsIterator5< AugGraph, /*AugOutEdgeIt,*/ ReachedMap > res_bfs(res_graph);
278 res_bfs.pushAndSetReached(s);
280 typename AugGraph::NodeMap<AugEdge> pred(res_graph);
281 pred.set(s, AugEdge(INVALID));
283 typename AugGraph::NodeMap<Number> free(res_graph);
285 //searching for augmenting path
286 while ( !res_bfs.finished() ) {
287 AugOutEdgeIt e=res_bfs;
288 if (res_graph.valid(e) && res_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.free(e)));
295 free.set(w, res_graph.free(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 AugEdge e=pred.get(n);
308 res_graph.augment(e, augment_value);
316 template<typename MutableGraph> bool augmentOnBlockingFlow() {
319 AugGraph res_graph(*G, *flow, *capacity);
321 typedef typename AugGraph::NodeMap<bool> ReachedMap;
322 BfsIterator4< AugGraph, AugOutEdgeIt, ReachedMap > bfs(res_graph);
324 bfs.pushAndSetReached(s);
325 typename AugGraph::NodeMap<int> dist(res_graph); //filled up with 0's
326 while ( !bfs.finished() ) {
328 if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
329 dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
333 } //computing distances from s in the residual graph
336 typename AugGraph::NodeMap<typename MutableGraph::Node>
337 res_graph_to_F(res_graph);
338 for(typename AugGraph::NodeIt n=res_graph.template first<typename AugGraph::NodeIt>(); res_graph.valid(n); res_graph.next(n)) {
339 res_graph_to_F.set(n, F.addNode());
342 typename MutableGraph::Node sF=res_graph_to_F.get(s);
343 typename MutableGraph::Node tF=res_graph_to_F.get(t);
345 typename MutableGraph::EdgeMap<AugEdge> original_edge(F);
346 typename MutableGraph::EdgeMap<Number> residual_capacity(F);
348 //Making F to the graph containing the edges of the residual graph
349 //which are in some shortest paths
350 for(typename AugGraph::EdgeIt e=res_graph.template first<typename AugGraph::EdgeIt>(); res_graph.valid(e); res_graph.next(e)) {
351 if (dist.get(res_graph.head(e))==dist.get(res_graph.tail(e))+1) {
352 typename MutableGraph::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
353 original_edge.update();
354 original_edge.set(f, e);
355 residual_capacity.update();
356 residual_capacity.set(f, res_graph.free(e));
364 //computing blocking flow with dfs
365 typedef typename MutableGraph::NodeMap<bool> BlockingReachedMap;
366 DfsIterator4< MutableGraph, typename MutableGraph::OutEdgeIt, BlockingReachedMap > dfs(F);
367 typename MutableGraph::NodeMap<typename MutableGraph::Edge> pred(F);
368 pred.set(sF, typename MutableGraph::Edge(INVALID));
369 //invalid iterators for sources
371 typename MutableGraph::NodeMap<Number> free(F);
373 dfs.pushAndSetReached(sF);
374 while (!dfs.finished()) {
376 if (F.valid(typename MutableGraph::OutEdgeIt(dfs))) {
377 if (dfs.isBNodeNewlyReached()) {
378 typename MutableGraph::Node v=F.aNode(dfs);
379 typename MutableGraph::Node w=F.bNode(dfs);
381 if (F.valid(pred.get(v))) {
382 free.set(w, std::min(free.get(v), residual_capacity.get(dfs)));
384 free.set(w, residual_capacity.get(dfs));
393 F.erase(typename MutableGraph::OutEdgeIt(dfs));
399 typename MutableGraph::Node n=tF;
400 Number augment_value=free.get(tF);
401 while (F.valid(pred.get(n))) {
402 typename MutableGraph::Edge e=pred.get(n);
403 res_graph.augment(original_edge.get(e), augment_value);
405 if (residual_capacity.get(e)==augment_value)
408 residual_capacity.set(e, residual_capacity.get(e)-augment_value);
416 template<typename MutableGraph> bool augmentOnBlockingFlow1() {
419 AugGraph res_graph(*G, *flow, *capacity);
421 //bfs for distances on the residual graph
422 typedef typename AugGraph::NodeMap<bool> ReachedMap;
423 BfsIterator4< AugGraph, AugOutEdgeIt, ReachedMap > bfs(res_graph);
424 bfs.pushAndSetReached(s);
425 typename AugGraph::NodeMap<int> dist(res_graph); //filled up with 0's
427 //F will contain the physical copy of the residual graph
428 //with the set of edges which areon shortest paths
430 typename AugGraph::NodeMap<typename MutableGraph::Node>
431 res_graph_to_F(res_graph);
432 for(typename AugGraph::NodeIt n=res_graph.template first<typename AugGraph::NodeIt>(); res_graph.valid(n); res_graph.next(n)) {
433 res_graph_to_F.set(n, F.addNode());
435 typename MutableGraph::Node sF=res_graph_to_F.get(s);
436 typename MutableGraph::Node tF=res_graph_to_F.get(t);
437 typename MutableGraph::EdgeMap<AugEdge> original_edge(F);
438 typename MutableGraph::EdgeMap<Number> residual_capacity(F);
440 while ( !bfs.finished() ) {
442 if (res_graph.valid(e)) {
443 if (bfs.isBNodeNewlyReached()) {
444 dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
445 typename MutableGraph::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
446 original_edge.update();
447 original_edge.set(f, e);
448 residual_capacity.update();
449 residual_capacity.set(f, res_graph.free(e));
451 if (dist.get(res_graph.head(e))==(dist.get(res_graph.tail(e))+1)) {
452 typename MutableGraph::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
453 original_edge.update();
454 original_edge.set(f, e);
455 residual_capacity.update();
456 residual_capacity.set(f, res_graph.free(e));
461 } //computing distances from s in the residual graph
467 //computing blocking flow with dfs
468 typedef typename MutableGraph::NodeMap<bool> BlockingReachedMap;
469 DfsIterator4< MutableGraph, typename MutableGraph::OutEdgeIt, BlockingReachedMap > dfs(F);
470 typename MutableGraph::NodeMap<typename MutableGraph::Edge> pred(F);
471 pred.set(sF, typename MutableGraph::Edge(INVALID));
472 //invalid iterators for sources
474 typename MutableGraph::NodeMap<Number> free(F);
476 dfs.pushAndSetReached(sF);
477 while (!dfs.finished()) {
479 if (F.valid(typename MutableGraph::OutEdgeIt(dfs))) {
480 if (dfs.isBNodeNewlyReached()) {
481 typename MutableGraph::Node v=F.aNode(dfs);
482 typename MutableGraph::Node w=F.bNode(dfs);
484 if (F.valid(pred.get(v))) {
485 free.set(w, std::min(free.get(v), residual_capacity.get(dfs)));
487 free.set(w, residual_capacity.get(dfs));
496 F.erase(typename MutableGraph::OutEdgeIt(dfs));
502 typename MutableGraph::Node n=tF;
503 Number augment_value=free.get(tF);
504 while (F.valid(pred.get(n))) {
505 typename MutableGraph::Edge e=pred.get(n);
506 res_graph.augment(original_edge.get(e), augment_value);
508 if (residual_capacity.get(e)==augment_value)
511 residual_capacity.set(e, residual_capacity.get(e)-augment_value);
519 bool augmentOnBlockingFlow2() {
522 //typedef ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> EAugGraph;
523 typedef FilterGraphWrapper< ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> > EAugGraph;
524 typedef typename EAugGraph::OutEdgeIt EAugOutEdgeIt;
525 typedef typename EAugGraph::Edge EAugEdge;
527 EAugGraph res_graph(*G, *flow, *capacity);
529 //typedef typename EAugGraph::NodeMap<bool> ReachedMap;
531 ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>,
532 typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt,
533 ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<bool> > bfs(res_graph);
535 bfs.pushAndSetReached(s);
537 typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::
538 NodeMap<int>& dist=res_graph.dist;
540 while ( !bfs.finished() ) {
541 typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt e=bfs;
542 if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
543 dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
546 } //computing distances from s in the residual graph
553 //computing blocking flow with dfs
554 typedef typename EAugGraph::NodeMap<bool> BlockingReachedMap;
555 DfsIterator4< EAugGraph, EAugOutEdgeIt, BlockingReachedMap >
557 typename EAugGraph::NodeMap<EAugEdge> pred(res_graph);
558 pred.set(s, EAugEdge(INVALID));
559 //invalid iterators for sources
561 typename EAugGraph::NodeMap<Number> free(res_graph);
563 dfs.pushAndSetReached(s);
564 while (!dfs.finished()) {
566 if (res_graph.valid(EAugOutEdgeIt(dfs))) {
567 if (dfs.isBNodeNewlyReached()) {
569 typename EAugGraph::Node v=res_graph.aNode(dfs);
570 typename EAugGraph::Node w=res_graph.bNode(dfs);
572 pred.set(w, EAugOutEdgeIt(dfs));
573 if (res_graph.valid(pred.get(v))) {
574 free.set(w, std::min(free.get(v), res_graph.free(dfs)));
576 free.set(w, res_graph.free(dfs));
585 res_graph.erase(dfs);
592 typename EAugGraph::Node n=t;
593 Number augment_value=free.get(t);
594 while (res_graph.valid(pred.get(n))) {
595 EAugEdge e=pred.get(n);
596 res_graph.augment(e, augment_value);
598 if (res_graph.free(e)==0)
608 //int num_of_augmentations=0;
609 while (augmentOnShortestPath()) {
610 //while (augmentOnBlockingFlow<MutableGraph>()) {
611 //std::cout << ++num_of_augmentations << " ";
612 //std::cout<<std::endl;
615 template<typename MutableGraph> void run() {
616 //int num_of_augmentations=0;
617 //while (augmentOnShortestPath()) {
618 while (augmentOnBlockingFlow<MutableGraph>()) {
619 //std::cout << ++num_of_augmentations << " ";
620 //std::cout<<std::endl;
626 for(G->/*getF*/first(e, s); G->valid(e); G->next(e)) {
634 template <typename Graph, typename Number, typename FlowMap, typename CapacityMap>
637 typedef typename Graph::Node Node;
638 typedef typename Graph::NodeIt NodeIt;
639 typedef typename Graph::Edge Edge;
640 typedef typename Graph::EdgeIt EdgeIt;
641 typedef typename Graph::OutEdgeIt OutEdgeIt;
642 typedef typename Graph::InEdgeIt InEdgeIt;
644 typedef typename Graph::NodeMap<bool> SMap;
645 typedef typename Graph::NodeMap<bool> TMap;
653 const CapacityMap* capacity;
654 typedef ResGraphWrapper<Graph, Number, FlowMap, CapacityMap > AugGraph;
655 typedef typename AugGraph::OutEdgeIt AugOutEdgeIt;
656 typedef typename AugGraph::Edge AugEdge;
657 typename Graph::NodeMap<int> used; //0
660 MaxMatching(const Graph& _G, SMap& _S, TMap& _T, FlowMap& _flow, const CapacityMap& _capacity) :
661 G(&_G), S(&_S), T(&_T), flow(&_flow), capacity(&_capacity), used(_G) { }
662 bool augmentOnShortestPath() {
663 AugGraph res_graph(*G, *flow, *capacity);
666 typedef typename AugGraph::NodeMap<bool> ReachedMap;
667 BfsIterator5< AugGraph, /*AugOutEdgeIt,*/ ReachedMap > res_bfs(res_graph);
668 typename AugGraph::NodeMap<AugEdge> pred(res_graph);
669 for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
670 if ((S->get(s)) && (used.get(s)<1) ) {
672 //for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
675 res_bfs.pushAndSetReached(s);
676 pred.set(s, AugEdge(INVALID));
681 typename AugGraph::NodeMap<Number> free(res_graph);
684 //searching for augmenting path
685 while ( !res_bfs.finished() ) {
686 AugOutEdgeIt e=res_bfs;
687 if (res_graph.valid(e) && res_bfs.isBNodeNewlyReached()) {
688 Node v=res_graph.tail(e);
689 Node w=res_graph.head(e);
691 if (res_graph.valid(pred.get(v))) {
692 free.set(w, std::min(free.get(v), res_graph.free(e)));
694 free.set(w, res_graph.free(e));
697 if (T->get(n) && (used.get(n)<1) ) {
699 //for(InEdgeIt f=G->template first<InEdgeIt>(n); G->valid(f); G->next(f))
709 } //end of searching augmenting path
713 used.set(n, 1); //mind2 vegen jav
714 Number augment_value=free.get(n);
715 while (res_graph.valid(pred.get(n))) {
716 AugEdge e=pred.get(n);
717 res_graph.augment(e, augment_value);
720 used.set(n, 1); //mind2 vegen jav
726 // template<typename MutableGraph> bool augmentOnBlockingFlow() {
727 // bool _augment=false;
729 // AugGraph res_graph(*G, *flow, *capacity);
731 // typedef typename AugGraph::NodeMap<bool> ReachedMap;
732 // BfsIterator4< AugGraph, AugOutEdgeIt, ReachedMap > bfs(res_graph);
738 // //typename AugGraph::NodeMap<AugEdge> pred(res_graph);
739 // for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
742 // for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
745 // res_bfs.pushAndSetReached(s);
746 // //pred.set(s, AugEdge(INVALID));
754 // //bfs.pushAndSetReached(s);
755 // typename AugGraph::NodeMap<int> dist(res_graph); //filled up with 0's
756 // while ( !bfs.finished() ) {
757 // AugOutEdgeIt e=bfs;
758 // if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
759 // dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
763 // } //computing distances from s in the residual graph
766 // typename AugGraph::NodeMap<typename MutableGraph::Node>
767 // res_graph_to_F(res_graph);
768 // for(typename AugGraph::NodeIt n=res_graph.template first<typename AugGraph::NodeIt>(); res_graph.valid(n); res_graph.next(n)) {
769 // res_graph_to_F.set(n, F.addNode());
772 // typename MutableGraph::Node sF=res_graph_to_F.get(s);
773 // typename MutableGraph::Node tF=res_graph_to_F.get(t);
775 // typename MutableGraph::EdgeMap<AugEdge> original_edge(F);
776 // typename MutableGraph::EdgeMap<Number> residual_capacity(F);
778 // //Making F to the graph containing the edges of the residual graph
779 // //which are in some shortest paths
780 // for(typename AugGraph::EdgeIt e=res_graph.template first<typename AugGraph::EdgeIt>(); res_graph.valid(e); res_graph.next(e)) {
781 // if (dist.get(res_graph.head(e))==dist.get(res_graph.tail(e))+1) {
782 // typename MutableGraph::Edge f=F.addEdge(res_graph_to_F.get(res_graph.tail(e)), res_graph_to_F.get(res_graph.head(e)));
783 // original_edge.update();
784 // original_edge.set(f, e);
785 // residual_capacity.update();
786 // residual_capacity.set(f, res_graph.free(e));
790 // bool __augment=true;
792 // while (__augment) {
794 // //computing blocking flow with dfs
795 // typedef typename MutableGraph::NodeMap<bool> BlockingReachedMap;
796 // DfsIterator4< MutableGraph, typename MutableGraph::OutEdgeIt, BlockingReachedMap > dfs(F);
797 // typename MutableGraph::NodeMap<typename MutableGraph::Edge> pred(F);
798 // pred.set(sF, typename MutableGraph::Edge(INVALID));
799 // //invalid iterators for sources
801 // typename MutableGraph::NodeMap<Number> free(F);
803 // dfs.pushAndSetReached(sF);
804 // while (!dfs.finished()) {
806 // if (F.valid(typename MutableGraph::OutEdgeIt(dfs))) {
807 // if (dfs.isBNodeNewlyReached()) {
808 // typename MutableGraph::Node v=F.aNode(dfs);
809 // typename MutableGraph::Node w=F.bNode(dfs);
811 // if (F.valid(pred.get(v))) {
812 // free.set(w, std::min(free.get(v), residual_capacity.get(dfs)));
814 // free.set(w, residual_capacity.get(dfs));
823 // F.erase(typename MutableGraph::OutEdgeIt(dfs));
829 // typename MutableGraph::Node n=tF;
830 // Number augment_value=free.get(tF);
831 // while (F.valid(pred.get(n))) {
832 // typename MutableGraph::Edge e=pred.get(n);
833 // res_graph.augment(original_edge.get(e), augment_value);
835 // if (residual_capacity.get(e)==augment_value)
838 // residual_capacity.set(e, residual_capacity.get(e)-augment_value);
846 bool augmentOnBlockingFlow2() {
849 //typedef ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> EAugGraph;
850 typedef FilterGraphWrapper< ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> > EAugGraph;
851 typedef typename EAugGraph::OutEdgeIt EAugOutEdgeIt;
852 typedef typename EAugGraph::Edge EAugEdge;
854 EAugGraph res_graph(*G, *flow, *capacity);
856 //typedef typename EAugGraph::NodeMap<bool> ReachedMap;
858 ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>,
859 typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt,
860 ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<bool> > bfs(res_graph);
863 //typename AugGraph::NodeMap<AugEdge> pred(res_graph);
864 for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
867 for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
870 bfs.pushAndSetReached(s);
871 //pred.set(s, AugEdge(INVALID));
877 //bfs.pushAndSetReached(s);
879 typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::
880 NodeMap<int>& dist=res_graph.dist;
882 while ( !bfs.finished() ) {
883 typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt e=bfs;
884 if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
885 dist.set(res_graph.head(e), dist.get(res_graph.tail(e))+1);
888 } //computing distances from s in the residual graph
895 //computing blocking flow with dfs
896 typedef typename EAugGraph::NodeMap<bool> BlockingReachedMap;
897 DfsIterator4< EAugGraph, EAugOutEdgeIt, BlockingReachedMap >
899 typename EAugGraph::NodeMap<EAugEdge> pred(res_graph, INVALID);
900 //pred.set(s, EAugEdge(INVALID));
901 //invalid iterators for sources
903 typename EAugGraph::NodeMap<Number> free(res_graph);
906 //typename AugGraph::NodeMap<AugEdge> pred(res_graph);
907 for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
910 for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
913 dfs.pushAndSetReached(s);
914 //pred.set(s, AugEdge(INVALID));
921 //dfs.pushAndSetReached(s);
922 typename EAugGraph::Node n;
923 while (!dfs.finished()) {
925 if (res_graph.valid(EAugOutEdgeIt(dfs))) {
926 if (dfs.isBNodeNewlyReached()) {
928 typename EAugGraph::Node v=res_graph.aNode(dfs);
929 typename EAugGraph::Node w=res_graph.bNode(dfs);
931 pred.set(w, EAugOutEdgeIt(dfs));
932 if (res_graph.valid(pred.get(v))) {
933 free.set(w, std::min(free.get(v), res_graph.free(dfs)));
935 free.set(w, res_graph.free(dfs));
941 for(InEdgeIt f=G->template first<InEdgeIt>(n); G->valid(f); G->next(f))
950 res_graph.erase(dfs);
957 // typename EAugGraph::Node n=t;
958 Number augment_value=free.get(n);
959 while (res_graph.valid(pred.get(n))) {
960 EAugEdge e=pred.get(n);
961 res_graph.augment(e, augment_value);
963 if (res_graph.free(e)==0)
973 //int num_of_augmentations=0;
974 while (augmentOnShortestPath()) {
975 //while (augmentOnBlockingFlow<MutableGraph>()) {
976 //std::cout << ++num_of_augmentations << " ";
977 //std::cout<<std::endl;
980 // template<typename MutableGraph> void run() {
981 // //int num_of_augmentations=0;
982 // //while (augmentOnShortestPath()) {
983 // while (augmentOnBlockingFlow<MutableGraph>()) {
984 // //std::cout << ++num_of_augmentations << " ";
985 // //std::cout<<std::endl;
991 for(G->/*getF*/first(e); G->valid(e); G->next(e)) {
1003 // template <typename Graph, typename Number, typename FlowMap, typename CapacityMap>
1006 // typedef typename Graph::Node Node;
1007 // typedef typename Graph::Edge Edge;
1008 // typedef typename Graph::EdgeIt EdgeIt;
1009 // typedef typename Graph::OutEdgeIt OutEdgeIt;
1010 // typedef typename Graph::InEdgeIt InEdgeIt;
1013 // std::list<Node>& S;
1014 // std::list<Node>& T;
1016 // const CapacityMap& capacity;
1017 // typedef ResGraphWrapper<Graph, Number, FlowMap, CapacityMap > AugGraph;
1018 // typedef typename AugGraph::OutEdgeIt AugOutEdgeIt;
1019 // typedef typename AugGraph::Edge AugEdge;
1020 // typename Graph::NodeMap<bool> SMap;
1021 // typename Graph::NodeMap<bool> TMap;
1023 // 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) {
1024 // for(typename std::list<Node>::const_iterator i=S.begin();
1025 // i!=S.end(); ++i) {
1026 // SMap.set(*i, true);
1028 // for (typename std::list<Node>::const_iterator i=T.begin();
1029 // i!=T.end(); ++i) {
1030 // TMap.set(*i, true);
1034 // AugGraph res_graph(G, flow, capacity);
1035 // bool _augment=false;
1036 // Node reached_t_node;
1038 // typedef typename AugGraph::NodeMap<bool> ReachedMap;
1039 // BfsIterator4< AugGraph, AugOutEdgeIt, ReachedMap > res_bfs(res_graph);
1040 // for(typename std::list<Node>::const_iterator i=S.begin();
1041 // i!=S.end(); ++i) {
1042 // res_bfs.pushAndSetReached(*i);
1044 // //res_bfs.pushAndSetReached(s);
1046 // typename AugGraph::NodeMap<AugEdge> pred(res_graph);
1047 // //filled up with invalid iterators
1049 // typename AugGraph::NodeMap<Number> free(res_graph);
1051 // //searching for augmenting path
1052 // while ( !res_bfs.finished() ) {
1053 // AugOutEdgeIt e=/*AugOutEdgeIt*/(res_bfs);
1054 // if (e.valid() && res_bfs.isBNodeNewlyReached()) {
1055 // Node v=res_graph.tail(e);
1056 // Node w=res_graph.head(e);
1058 // if (pred.get(v).valid()) {
1059 // free.set(w, std::min(free.get(v), e.free()));
1061 // free.set(w, e.free());
1063 // if (TMap.get(res_graph.head(e))) {
1065 // reached_t_node=res_graph.head(e);
1071 // } //end of searching augmenting path
1074 // Node n=reached_t_node;
1075 // Number augment_value=free.get(reached_t_node);
1076 // while (pred.get(n).valid()) {
1077 // AugEdge e=pred.get(n);
1078 // e.augment(augment_value);
1079 // n=res_graph.tail(e);
1086 // while (augment()) { }
1088 // Number flowValue() {
1090 // for(typename std::list<Node>::const_iterator i=S.begin();
1091 // i!=S.end(); ++i) {
1092 // for(OutEdgeIt e=G.template first<OutEdgeIt>(*i); e.valid(); ++e) {
1095 // for(InEdgeIt e=G.template first<InEdgeIt>(*i); e.valid(); ++e) {
1107 #endif //EDMONDS_KARP_H