A year has passed again.
2 #ifndef LEMON_EDMONDS_KARP_H
3 #define LEMON_EDMONDS_KARP_H
9 #include <bfs_iterator.h>
11 #include <graph_wrapper.h>
13 #include <for_each_macros.h>
17 template <typename Graph, typename Num,
18 typename CapMap, typename FlowMap>
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;
29 const CapMap* capacity;
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;
37 //reached is called level because of compatibility with preflow
40 MaxFlow(const Graph& _g, Node _s, Node _t, const CapMap& _capacity,
42 g(&_g), s(_s), t(_t), capacity(&_capacity), flow(&_flow), level(_g) { }
44 bool augmentOnShortestPath() {
45 ResGW res_graph(*g, *capacity, *flow);
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);
53 typename ResGW::template NodeMap<ResGWEdge> pred(res_graph);
56 typename ResGW::template NodeMap<Num> free(res_graph);
58 //searching for augmenting path
59 while ( !bfs.finished() ) {
61 if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) {
62 Node v=res_graph.source(e);
63 Node w=res_graph.target(e);
65 if (res_graph.valid(pred[v])) {
66 free.set(w, std::min(free[v], res_graph.resCap(e)));
68 free.set(w, res_graph.resCap(e));
70 if (res_graph.target(e)==t) { _augment=true; break; }
74 } //end of searching augmenting path
78 Num augment_value=free[t];
79 while (res_graph.valid(pred[n])) {
81 res_graph.augment(e, augment_value);
82 n=res_graph.source(e);
89 template<typename MapGraphWrapper>
92 const MapGraphWrapper* g;
93 typename MapGraphWrapper::template NodeMap<int> dist;
95 DistanceMap(MapGraphWrapper& _g) : g(&_g), dist(*g, g->nodeNum()) { }
96 void set(const typename MapGraphWrapper::Node& n, int a) {
99 int operator[](const typename MapGraphWrapper::Node& n)
101 // int get(const typename MapGraphWrapper::Node& n) const {
103 // bool get(const typename MapGraphWrapper::Edge& e) const {
104 // return (dist.get(g->source(e))<dist.get(g->target(e))); }
105 bool operator[](const typename MapGraphWrapper::Edge& e) const {
106 return (dist[g->source(e)]<dist[g->target(e)]);
110 template<typename MutableGraph> bool augmentOnBlockingFlow() {
111 typedef MutableGraph MG;
114 ResGW res_graph(*g, *capacity, *flow);
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);
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.target(e), dist[res_graph.source(e)]+1);
129 } //computing distances from s in the residual graph
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);
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());
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);
150 //Making F to the graph containing the edges of the residual graph
151 //which are in some shortest paths
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.target(e))==dist.get(res_graph.source(e))+1) {
156 typename MG::Edge f=F.addEdge(res_graph_to_F[res_graph.source(e)], res_graph_to_F[res_graph.target(e)]);
157 original_edge.update();
158 original_edge.set(f, e);
159 residual_capacity.update();
160 residual_capacity.set(f, res_graph.resCap(e));
169 //computing blocking flow with dfs
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
176 typename MG::template NodeMap<Num> free(F);
178 dfs.pushAndSetReached(sF);
179 while (!dfs.finished()) {
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);
186 if (F.valid(pred[v])) {
187 free.set(w, std::min(free[v], residual_capacity[dfs]));
189 free.set(w, residual_capacity[dfs]);
198 F.erase(/*typename MG::OutEdgeIt*/(dfs));
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);
210 if (residual_capacity[e]==augment_value)
213 residual_capacity.set(e, residual_capacity[e]-augment_value);
222 template<typename MutableGraph> bool augmentOnBlockingFlow1() {
223 typedef MutableGraph MG;
226 ResGW res_graph(*g, *capacity, *flow);
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
236 //F will contain the physical copy of the residual graph
237 //with the set of edges which are on shortest paths
239 typename ResGW::template NodeMap<typename MG::Node>
240 res_graph_to_F(res_graph);
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());
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);
253 while ( !bfs.finished() ) {
254 ResGWOutEdgeIt e=bfs;
255 if (res_graph.valid(e)) {
256 if (bfs.isBNodeNewlyReached()) {
257 dist.set(res_graph.target(e), dist[res_graph.source(e)]+1);
258 typename MG::Edge f=F.addEdge(res_graph_to_F[res_graph.source(e)], res_graph_to_F[res_graph.target(e)]);
259 original_edge.update();
260 original_edge.set(f, e);
261 residual_capacity.update();
262 residual_capacity.set(f, res_graph.resCap(e));
264 if (dist[res_graph.target(e)]==(dist[res_graph.source(e)]+1)) {
265 typename MG::Edge f=F.addEdge(res_graph_to_F[res_graph.source(e)], res_graph_to_F[res_graph.target(e)]);
266 original_edge.update();
267 original_edge.set(f, e);
268 residual_capacity.update();
269 residual_capacity.set(f, res_graph.resCap(e));
274 } //computing distances from s in the residual graph
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
286 typename MG::template NodeMap<Num> free(F);
288 dfs.pushAndSetReached(sF);
289 while (!dfs.finished()) {
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);
296 if (F.valid(pred[v])) {
297 free.set(w, std::min(free[v], residual_capacity[dfs]));
299 free.set(w, residual_capacity[dfs]);
308 F.erase(/*typename MG::OutEdgeIt*/(dfs));
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);
320 if (residual_capacity[e]==augment_value)
323 residual_capacity.set(e, residual_capacity[e]-augment_value);
332 bool augmentOnBlockingFlow2() {
335 ResGW res_graph(*g, *capacity, *flow);
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);
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.target(e), dist[res_graph.source(e)]+1);
349 } //computing distances from s in the residual graph
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);
357 //Subgraph, which is able to delete edges which are already
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))
365 typename FilterResGW::OutEdgeIt e;
366 filter_res_graph.first(e, v);
367 first_out_edges.set(v, e);
369 typedef ErasingFirstGraphWrapper<FilterResGW, typename FilterResGW::
370 template NodeMap<typename FilterResGW::OutEdgeIt> > ErasingResGW;
371 ErasingResGW erasing_res_graph(filter_res_graph, first_out_edges);
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
388 typename ErasingResGW::template NodeMap<Num>
389 free1(erasing_res_graph);
391 dfs.pushAndSetReached(
392 typename ErasingResGW::Node(
393 typename FilterResGW::Node(
394 typename ResGW::Node(s)
398 while (!dfs.finished()) {
400 if (erasing_res_graph.valid(
401 typename ErasingResGW::OutEdgeIt(dfs)))
403 if (dfs.isBNodeNewlyReached()) {
405 typename ErasingResGW::Node v=erasing_res_graph.aNode(dfs);
406 typename ErasingResGW::Node w=erasing_res_graph.bNode(dfs);
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))));
413 free1.set(w, res_graph.resCap(
414 typename ErasingResGW::OutEdgeIt(dfs)));
423 erasing_res_graph.erase(dfs);
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;
433 // typename FilterResGW::NodeMap<Num> a1(filter_res_graph);
434 // typename FilterResGW::Node b1;
436 // typename ErasingResGW::NodeMap<Num> a2(erasing_res_graph);
437 // typename ErasingResGW::Node 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.source(e);
444 if (res_graph.resCap(e)==0)
445 erasing_res_graph.erase(e);
449 } //while (__augment)
455 //int num_of_augmentations=0;
456 while (augmentOnShortestPath()) {
457 //while (augmentOnBlockingFlow<MutableGraph>()) {
458 //std::cout << ++num_of_augmentations << " ";
459 //std::cout<<std::endl;
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;
475 for(g->first(e, s); g->valid(e); g->next(e)) {
484 // template <typename Graph, typename Num, typename FlowMap, typename CapMap>
485 // class MaxMatching {
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;
494 // typedef typename Graph::NodeMap<bool> SMap;
495 // typedef typename Graph::NodeMap<bool> TMap;
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
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;
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) ) {
522 // //for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
523 // //u+=flow->get(e);
525 // bfs.pushAndSetReached(s);
526 // pred.set(s, AugEdge(INVALID));
531 // typename AugGraph::NodeMap<Num> free(res_graph);
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.source(e);
539 // Node w=res_graph.target(e);
541 // if (res_graph.valid(pred.get(v))) {
542 // free.set(w, std::min(free.get(v), res_graph.free(e)));
544 // free.set(w, res_graph.free(e));
546 // n=res_graph.target(e);
547 // if (T->get(n) && (used.get(n)<1) ) {
549 // //for(InEdgeIt f=G->template first<InEdgeIt>(n); G->valid(f); G->next(f))
550 // //u+=flow->get(f);
559 // } //end of searching augmenting path
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.source(e);
570 // used.set(n, 1); //mind2 vegen jav
576 // // template<typename MutableGraph> bool augmentOnBlockingFlow() {
577 // // bool _augment=false;
579 // // AugGraph res_graph(*G, *flow, *capacity);
581 // // typedef typename AugGraph::NodeMap<bool> ReachedMap;
582 // // BfsIterator4< AugGraph, AugOutEdgeIt, ReachedMap > bfs(res_graph);
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)) {
592 // // for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
593 // // u+=flow->get(e);
595 // // bfs.pushAndSetReached(s);
596 // // //pred.set(s, AugEdge(INVALID));
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.target(e), dist.get(res_graph.source(e))+1);
613 // // } //computing distances from s in the residual graph
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());
622 // // typename MutableGraph::Node sF=res_graph_to_F.get(s);
623 // // typename MutableGraph::Node tF=res_graph_to_F.get(t);
625 // // typename MutableGraph::EdgeMap<AugEdge> original_edge(F);
626 // // typename MutableGraph::EdgeMap<Num> residual_capacity(F);
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.target(e))==dist.get(res_graph.source(e))+1) {
632 // // typename MutableGraph::Edge f=F.addEdge(res_graph_to_F.get(res_graph.source(e)), res_graph_to_F.get(res_graph.target(e)));
633 // // original_edge.update();
634 // // original_edge.set(f, e);
635 // // residual_capacity.update();
636 // // residual_capacity.set(f, res_graph.free(e));
640 // // bool __augment=true;
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
651 // // typename MutableGraph::NodeMap<Num> free(F);
653 // // dfs.pushAndSetReached(sF);
654 // // while (!dfs.finished()) {
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)));
664 // // free.set(w, residual_capacity.get(dfs));
667 // // __augment=true;
673 // // F.erase(typename MutableGraph::OutEdgeIt(dfs));
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);
685 // // if (residual_capacity.get(e)==augment_value)
688 // // residual_capacity.set(e, residual_capacity.get(e)-augment_value);
694 // // return _augment;
696 // bool augmentOnBlockingFlow2() {
697 // bool _augment=false;
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;
704 // EAugGraph res_graph(*G, *flow, *capacity);
706 // //typedef typename EAugGraph::NodeMap<bool> ReachedMap;
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);
713 // //typename AugGraph::NodeMap<AugEdge> pred(res_graph);
714 // for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
717 // for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
720 // bfs.pushAndSetReached(s);
721 // //pred.set(s, AugEdge(INVALID));
727 // //bfs.pushAndSetReached(s);
729 // typename ErasingResGraphWrapper<Graph, Num, FlowMap, CapMap>::
730 // NodeMap<int>& dist=res_graph.dist;
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.target(e), dist.get(res_graph.source(e))+1);
738 // } //computing distances from s in the residual graph
740 // bool __augment=true;
742 // while (__augment) {
745 // //computing blocking flow with dfs
746 // typedef typename EAugGraph::NodeMap<bool> BlockingReachedMap;
747 // DfsIterator< EAugGraph/*, EAugOutEdgeIt*/, BlockingReachedMap >
749 // typename EAugGraph::NodeMap<EAugEdge> pred(res_graph, INVALID);
750 // //pred.set(s, EAugEdge(INVALID));
751 // //invalid iterators for sources
753 // typename EAugGraph::NodeMap<Num> free(res_graph);
756 // //typename AugGraph::NodeMap<AugEdge> pred(res_graph);
757 // for(NodeIt s=G->template first<NodeIt>(); G->valid(s); G->next(s)) {
760 // for(OutEdgeIt e=G->template first<OutEdgeIt>(s); G->valid(e); G->next(e))
763 // dfs.pushAndSetReached(s);
764 // //pred.set(s, AugEdge(INVALID));
771 // //dfs.pushAndSetReached(s);
772 // typename EAugGraph::Node n;
773 // while (!dfs.finished()) {
775 // if (res_graph.valid(EAugOutEdgeIt(dfs))) {
776 // if (dfs.isBNodeNewlyReached()) {
778 // typename EAugGraph::Node v=res_graph.aNode(dfs);
779 // typename EAugGraph::Node w=res_graph.bNode(dfs);
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)));
785 // free.set(w, res_graph.free(dfs));
791 // for(InEdgeIt f=G->template first<InEdgeIt>(n); G->valid(f); G->next(f))
800 // res_graph.erase(dfs);
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.source(e);
813 // if (res_graph.free(e)==0)
814 // res_graph.erase(e);
823 // //int num_of_augmentations=0;
824 // while (augmentOnShortestPath()) {
825 // //while (augmentOnBlockingFlow<MutableGraph>()) {
826 // //std::cout << ++num_of_augmentations << " ";
827 // //std::cout<<std::endl;
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;
841 // for(G->/*getF*/first(e); G->valid(e); G->next(e)) {
853 // // template <typename Graph, typename Num, typename FlowMap, typename CapMap>
854 // // class MaxFlow2 {
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;
862 // // const Graph& G;
863 // // std::list<Node>& S;
864 // // std::list<Node>& T;
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;
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);
878 // // for (typename std::list<Node>::const_iterator i=T.begin();
879 // // i!=T.end(); ++i) {
880 // // TMap.set(*i, true);
883 // // bool augment() {
884 // // AugGraph res_graph(G, flow, capacity);
885 // // bool _augment=false;
886 // // Node reached_t_node;
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);
894 // // //bfs.pushAndSetReached(s);
896 // // typename AugGraph::NodeMap<AugEdge> pred(res_graph);
897 // // //filled up with invalid iterators
899 // // typename AugGraph::NodeMap<Num> free(res_graph);
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.source(e);
906 // // Node w=res_graph.target(e);
907 // // pred.set(w, e);
908 // // if (pred.get(v).valid()) {
909 // // free.set(w, std::min(free.get(v), e.free()));
911 // // free.set(w, e.free());
913 // // if (TMap.get(res_graph.target(e))) {
915 // // reached_t_node=res_graph.target(e);
921 // // } //end of searching augmenting path
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.source(e);
933 // // return _augment;
936 // // while (augment()) { }
938 // // Num flowValue() {
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);
945 // // for(InEdgeIt e=G.template first<InEdgeIt>(*i); e.valid(); ++e) {
946 // // a-=flow.get(e);
956 #endif //LEMON_EDMONDS_KARP_H