# HG changeset patch # User Alpar Juttner # Date 1277438456 -7200 # Node ID a22b3f1bf83e88557d0815adbe2b238cd19a3d6b # Parent 0bca98cbebbbc65ed7baecaf7a4f68ab881e28e9# Parent bb70ad62c95fd75d6bd134451a406df9bd0eda12 Merge bugfix #372 diff -r 0bca98cbebbb -r a22b3f1bf83e lemon/preflow.h --- a/lemon/preflow.h Mon May 03 10:56:24 2010 +0200 +++ b/lemon/preflow.h Fri Jun 25 06:00:56 2010 +0200 @@ -576,12 +576,18 @@ void startFirstPhase() { _phase = true; - Node n = _level->highestActive(); - int level = _level->highestActiveLevel(); - while (n != INVALID) { + while (true) { int num = _node_num; - while (num > 0 && n != INVALID) { + Node n = INVALID; + int level = -1; + + while (num > 0) { + n = _level->highestActive(); + if (n == INVALID) goto first_phase_done; + level = _level->highestActiveLevel(); + --num; + Value excess = (*_excess)[n]; int new_level = _level->maxLevel(); @@ -647,14 +653,22 @@ } else { _level->deactivate(n); } - - n = _level->highestActive(); - level = _level->highestActiveLevel(); - --num; } num = _node_num * 20; - while (num > 0 && n != INVALID) { + while (num > 0) { + while (level >= 0 && _level->activeFree(level)) { + --level; + } + if (level == -1) { + n = _level->highestActive(); + level = _level->highestActiveLevel(); + if (n == INVALID) goto first_phase_done; + } else { + n = _level->activeOn(level); + } + --num; + Value excess = (*_excess)[n]; int new_level = _level->maxLevel(); @@ -720,19 +734,9 @@ } else { _level->deactivate(n); } - - while (level >= 0 && _level->activeFree(level)) { - --level; - } - if (level == -1) { - n = _level->highestActive(); - level = _level->highestActiveLevel(); - } else { - n = _level->activeOn(level); - } - --num; } } + first_phase_done:; } /// \brief Starts the second phase of the preflow algorithm.