COIN-OR::LEMON - Graph Library

Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • lemon/preflow.h

    r688 r1027  
    375375    ///
    376376    /// Sets the tolerance used by algorithm.
    377     Preflow& tolerance(const Tolerance& tolerance) const {
     377    Preflow& tolerance(const Tolerance& tolerance) {
    378378      _tolerance = tolerance;
    379379      return *this;
     
    384384    /// Returns a const reference to the tolerance.
    385385    const Tolerance& tolerance() const {
    386       return tolerance;
     386      return _tolerance;
    387387    }
    388388
     
    526526          _flow->set(e, (*_capacity)[e]);
    527527          (*_excess)[u] += rem;
    528           if (u != _target && !_level->active(u)) {
    529             _level->activate(u);
    530           }
    531528        }
    532529      }
     
    538535          _flow->set(e, 0);
    539536          (*_excess)[v] += rem;
    540           if (v != _target && !_level->active(v)) {
    541             _level->activate(v);
    542           }
    543         }
    544       }
     537        }
     538      }
     539      for (NodeIt n(_graph); n != INVALID; ++n)
     540        if(n!=_source && n!=_target && _tolerance.positive((*_excess)[n]))
     541          _level->activate(n);
     542         
    545543      return true;
    546544    }
     
    559557      _phase = true;
    560558
    561       Node n = _level->highestActive();
    562       int level = _level->highestActiveLevel();
    563       while (n != INVALID) {
     559      while (true) {
    564560        int num = _node_num;
    565561
    566         while (num > 0 && n != INVALID) {
     562        Node n = INVALID;
     563        int level = -1;
     564
     565        while (num > 0) {
     566          n = _level->highestActive();
     567          if (n == INVALID) goto first_phase_done;
     568          level = _level->highestActiveLevel();
     569          --num;
     570         
    567571          Value excess = (*_excess)[n];
    568572          int new_level = _level->maxLevel();
     
    630634            _level->deactivate(n);
    631635          }
    632 
    633           n = _level->highestActive();
    634           level = _level->highestActiveLevel();
     636        }
     637
     638        num = _node_num * 20;
     639        while (num > 0) {
     640          while (level >= 0 && _level->activeFree(level)) {
     641            --level;
     642          }
     643          if (level == -1) {
     644            n = _level->highestActive();
     645            level = _level->highestActiveLevel();
     646            if (n == INVALID) goto first_phase_done;
     647          } else {
     648            n = _level->activeOn(level);
     649          }
    635650          --num;
    636         }
    637 
    638         num = _node_num * 20;
    639         while (num > 0 && n != INVALID) {
     651
    640652          Value excess = (*_excess)[n];
    641653          int new_level = _level->maxLevel();
     
    703715            _level->deactivate(n);
    704716          }
    705 
    706           while (level >= 0 && _level->activeFree(level)) {
    707             --level;
    708           }
    709           if (level == -1) {
    710             n = _level->highestActive();
    711             level = _level->highestActiveLevel();
    712           } else {
    713             n = _level->activeOn(level);
    714           }
    715           --num;
    716         }
    717       }
     717        }
     718      }
     719    first_phase_done:;
    718720    }
    719721
Note: See TracChangeset for help on using the changeset viewer.