[Lemon-commits] Balazs Dezso: Fix critical bug in preflow (#372)
Lemon HG
hg at lemon.cs.elte.hu
Fri Jun 25 06:51:44 CEST 2010
details: http://lemon.cs.elte.hu/hg/lemon/rev/bb70ad62c95f
changeset: 982:bb70ad62c95f
user: Balazs Dezso <deba [at] inf.elte.hu>
date: Thu Jun 24 09:27:53 2010 +0200
description:
Fix critical bug in preflow (#372)
The wrong transition between the bound decrease and highest active
heuristics caused the bug. The last node chosen in bound decrease
mode is used in the first iteration in highest active mode.
diffstat:
lemon/preflow.h | 44 ++++++++++++++++++++++++--------------------
1 files changed, 24 insertions(+), 20 deletions(-)
diffs (75 lines):
diff --git a/lemon/preflow.h b/lemon/preflow.h
--- a/lemon/preflow.h
+++ b/lemon/preflow.h
@@ -558,12 +558,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();
@@ -629,14 +635,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();
@@ -702,19 +716,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.
More information about the Lemon-commits
mailing list