# HG changeset patch # User Alpar Juttner # Date 1298883487 -3600 # Node ID 79fab87ee483a4665e0092306fe7c3fb8fdcf310 # Parent 1861d5dcf3121bbef6c237910ab05e367c6dc977# Parent 30d5f950aa5f4347b3bef4e9ab7c01c3eb8f05c7 Merge bugfix #414 to branch 1.2 diff -r 1861d5dcf312 -r 79fab87ee483 lemon/preflow.h --- a/lemon/preflow.h Wed Sep 22 09:32:53 2010 +0200 +++ b/lemon/preflow.h Mon Feb 28 09:58:07 2011 +0100 @@ -543,9 +543,6 @@ if ((*_level)[u] == _level->maxLevel()) continue; _flow->set(e, (*_capacity)[e]); (*_excess)[u] += rem; - if (u != _target && !_level->active(u)) { - _level->activate(u); - } } } for (InArcIt e(_graph, _source); e != INVALID; ++e) { @@ -555,11 +552,12 @@ if ((*_level)[v] == _level->maxLevel()) continue; _flow->set(e, 0); (*_excess)[v] += rem; - if (v != _target && !_level->active(v)) { - _level->activate(v); - } } } + for (NodeIt n(_graph); n != INVALID; ++n) + if(n!=_source && n!=_target && _tolerance.positive((*_excess)[n])) + _level->activate(n); + return true; } diff -r 1861d5dcf312 -r 79fab87ee483 test/preflow_test.cc --- a/test/preflow_test.cc Wed Sep 22 09:32:53 2010 +0200 +++ b/test/preflow_test.cc Mon Feb 28 09:58:07 2011 +0100 @@ -156,6 +156,30 @@ return true; } +void initFlowTest() +{ + DIGRAPH_TYPEDEFS(SmartDigraph); + + SmartDigraph g; + SmartDigraph::ArcMap cap(g),iflow(g); + Node s=g.addNode(); Node t=g.addNode(); + Node n1=g.addNode(); Node n2=g.addNode(); + Arc a; + a=g.addArc(s,n1); cap[a]=20; iflow[a]=20; + a=g.addArc(n1,n2); cap[a]=10; iflow[a]=0; + a=g.addArc(n2,t); cap[a]=20; iflow[a]=0; + + Preflow pre(g,cap,s,t); + pre.init(iflow); + pre.startFirstPhase(); + check(pre.flowValue() == 10, "The incorrect max flow value."); + check(pre.minCut(s), "Wrong min cut (Node s)."); + check(pre.minCut(n1), "Wrong min cut (Node n1)."); + check(!pre.minCut(n2), "Wrong min cut (Node n2)."); + check(!pre.minCut(t), "Wrong min cut (Node t)."); +} + + int main() { typedef SmartDigraph Digraph; @@ -246,5 +270,7 @@ check(preflow_test.flowValue() == min_cut_value, "The max flow value or the three min cut values are incorrect."); + initFlowTest(); + return 0; }