diff -r 7949a29a334e -r 27fbd1559fb7 src/work/edmonds_karp.hh --- a/src/work/edmonds_karp.hh Thu Mar 11 12:55:50 2004 +0000 +++ b/src/work/edmonds_karp.hh Thu Mar 11 14:15:07 2004 +0000 @@ -279,7 +279,7 @@ bool _augment=false; typedef typename AugGraph::NodeMap ReachedMap; - BfsIterator5< AugGraph, AugOutEdgeIt, ReachedMap > res_bfs(res_graph); + BfsIterator5< AugGraph, /*AugOutEdgeIt,*/ ReachedMap > res_bfs(res_graph); res_bfs.pushAndSetReached(s); typename AugGraph::NodeMap pred(res_graph); @@ -296,9 +296,9 @@ NodeIt w=res_graph.head(e); pred.set(w, e); if (res_graph.valid(pred.get(v))) { - free.set(w, std::min(free.get(v), e.free())); + free.set(w, std::min(free.get(v), res_graph.free(e))); } else { - free.set(w, e.free()); + free.set(w, res_graph.free(e)); } if (res_graph.head(e)==t) { _augment=true; break; } } @@ -311,7 +311,8 @@ Number augment_value=free.get(t); while (res_graph.valid(pred.get(n))) { AugEdgeIt e=pred.get(n); - e.augment(augment_value); + res_graph.augment(e, augment_value); + //e.augment(augment_value); n=res_graph.tail(e); } } @@ -358,7 +359,7 @@ original_edge.update(); original_edge.set(f, e); residual_capacity.update(); - residual_capacity.set(f, e.free()); + residual_capacity.set(f, res_graph.free(e)); } } @@ -376,44 +377,30 @@ while (!dfs.finished()) { ++dfs; if (F.valid(typename MutableGraph::OutEdgeIt(dfs))) { - //std::cout << "OutEdgeIt: " << dfs; - //std::cout << " aNode: " << F.aNode(dfs); - //std::cout << " bNode: " << F.bNode(dfs) << " "; + if (dfs.isBNodeNewlyReached()) { +// std::cout << "OutEdgeIt: " << dfs; +// std::cout << " aNode: " << F.aNode(dfs); +// std::cout << " bNode: " << F.bNode(dfs) << " "; - typename MutableGraph::NodeIt v=F.aNode(dfs); - typename MutableGraph::NodeIt w=F.bNode(dfs); - pred.set(w, dfs); - if (F.valid(pred.get(v))) { - free.set(w, std::min(free.get(v), residual_capacity.get(dfs))); + typename MutableGraph::NodeIt v=F.aNode(dfs); + typename MutableGraph::NodeIt w=F.bNode(dfs); + pred.set(w, dfs); + if (F.valid(pred.get(v))) { + free.set(w, std::min(free.get(v), residual_capacity.get(dfs))); + } else { + free.set(w, residual_capacity.get(dfs)); + } + if (w==tF) { + //std::cout << "AUGMENTATION"< EAugGraph; + typedef FilterGraphWrapper< ErasingResGraphWrapper > EAugGraph; + typedef typename EAugGraph::OutEdgeIt EAugOutEdgeIt; + typedef typename EAugGraph::EdgeIt EAugEdgeIt; + + EAugGraph res_graph(*G, *flow, *capacity); + + //std::cout << "meg jo1" << std::endl; + + //typedef typename EAugGraph::NodeMap ReachedMap; + BfsIterator4< + ErasingResGraphWrapper, + ErasingResGraphWrapper::OutEdgeIt, + ErasingResGraphWrapper::NodeMap > bfs(res_graph); + + //std::cout << "meg jo2" << std::endl; + + bfs.pushAndSetReached(s); + //std::cout << "meg jo2.5" << std::endl; + + //typename EAugGraph::NodeMap dist(res_graph); //filled up with 0's + typename ErasingResGraphWrapper:: + NodeMap& dist=res_graph.dist; + //std::cout << "meg jo2.6" << std::endl; + + while ( !bfs.finished() ) { + ErasingResGraphWrapper::OutEdgeIt e=bfs; +// EAugOutEdgeIt e=/*AugOutEdgeIt*/(bfs); + //if (res_graph.valid(e)) { + // std::cout<<"a:"<(); res_graph.valid(n); res_graph.next(n)) { +// std::cout << "dist: " << dist.get(n) << std::endl; +// } + + bool __augment=true; + + while (__augment) { +// std::cout << "new iteration"<< std::endl; + + __augment=false; + //computing blocking flow with dfs + typedef typename EAugGraph::NodeMap BlockingReachedMap; + DfsIterator4< EAugGraph, EAugOutEdgeIt, BlockingReachedMap > + dfs(res_graph); + typename EAugGraph::NodeMap pred(res_graph); //invalid iterators + typename EAugGraph::NodeMap free(res_graph); + + dfs.pushAndSetReached(s); + while (!dfs.finished()) { + ++dfs; + if (res_graph.valid(EAugOutEdgeIt(dfs))) { + if (dfs.isBNodeNewlyReached()) { +// std::cout << "OutEdgeIt: " << dfs; +// std::cout << " aNode: " << res_graph.aNode(dfs); +// std::cout << " res cap: " << EAugOutEdgeIt(dfs).free(); +// std::cout << " bNode: " << res_graph.bNode(dfs) << " "; + + typename EAugGraph::NodeIt v=res_graph.aNode(dfs); + typename EAugGraph::NodeIt w=res_graph.bNode(dfs); + + pred.set(w, EAugOutEdgeIt(dfs)); + + //std::cout << EAugOutEdgeIt(dfs).free() << std::endl; + if (res_graph.valid(pred.get(v))) { + free.set(w, std::min(free.get(v), res_graph.free(/*EAugOutEdgeIt*/(dfs)))); + } else { + free.set(w, res_graph.free(/*EAugOutEdgeIt*/(dfs))); + } + + if (w==t) { +// std::cout << "t is reached, AUGMENTATION"<> "; + + res_graph.erase(dfs); + } + } + + } + + if (__augment) { + typename EAugGraph::NodeIt n=t; + Number augment_value=free.get(t); +// std::cout << "av:" << augment_value << std::endl; + while (res_graph.valid(pred.get(n))) { + EAugEdgeIt e=pred.get(n); + res_graph.augment(e, augment_value); + //e.augment(augment_value); + n=res_graph.tail(e); + if (res_graph.free(e)==0) + res_graph.erase(e); + } + } }