COIN-OR::LEMON - Graph Library

Ignore:
Timestamp:
11/21/07 14:35:10 (17 years ago)
Author:
Balazs Dezso
Branch:
default
Phase:
public
Convert:
svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@3395
Message:

Changed queue implementation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lemon/dinitz_sleator_tarjan.h

    r2514 r2519  
    2525/// and Tarjan.
    2626
    27 #include <lemon/time_measure.h>
    28 #include <queue>
    2927#include <lemon/graph_utils.h>
    3028#include <lemon/tolerance.h>
    31 #include <lemon/graph_adaptor.h>
    32 #include <lemon/bfs.h>
    33 #include <lemon/edge_set.h>
    3429#include <lemon/dynamic_tree.h>
    3530
     
    161156    DynTree* _dt;
    162157
     158    std::vector<Node> _queue;
     159
    163160    Tolerance _tolerance;
    164161   
     
    230227        _flow(0), _local_flow(false),
    231228        _level(0), _dt_edges(0),
    232         _dt_index(0), _dt(0),
     229        _dt_index(0), _dt(0), _queue(),
    233230        _tolerance(), _flow_value(), _max_value()
    234231    {
     
    327324        _dt_edges = new EdgeNodeMap(_graph);
    328325      }
     326      _queue.resize(countNodes(_graph));
    329327      _max_value = _dt->maxValue();
    330328    }
     
    356354      int level = 0;
    357355
    358       std::vector<Node> queue;
    359       queue.push_back(_target);
     356      _queue[0] = _target;
    360357      _level->set(_target, level);
     358
     359      int first = 0, last = 1, limit = 0;
    361360     
    362       while ((*_level)[_source] == -2 && !queue.empty()) {
    363         std::vector<Node> nqueue;
    364         ++level;
     361      while (first != last && (*_level)[_source] == -2) {
     362        if (first == limit) {
     363          limit = last;
     364          ++level;
     365        }
    365366       
    366         for (int i = 0; i < int(queue.size()); ++i) {
    367           Node n = queue[i];
     367        Node n = _queue[first++];
    368368         
    369           for (OutEdgeIt e(_graph, n); e != INVALID; ++e) {
    370             Node v = _graph.target(e);
    371             if ((*_level)[v] != -2) continue;
    372             Value rem = (*_flow)[e];
    373             if (!_tolerance.positive(rem)) continue;
    374             _level->set(v, level);
    375             nqueue.push_back(v);
    376           }
    377 
    378           for (InEdgeIt e(_graph, n); e != INVALID; ++e) {
    379             Node v = _graph.source(e);
    380             if ((*_level)[v] != -2) continue;
    381             Value rem = (*_capacity)[e] - (*_flow)[e];
    382             if (!_tolerance.positive(rem)) continue;
    383             _level->set(v, level);
    384             nqueue.push_back(v);
    385           }
    386 
    387         }
    388         queue.swap(nqueue);
    389       }
    390      
     369        for (OutEdgeIt e(_graph, n); e != INVALID; ++e) {
     370          Node v = _graph.target(e);
     371          if ((*_level)[v] != -2) continue;
     372          Value rem = (*_flow)[e];
     373          if (!_tolerance.positive(rem)) continue;
     374          _level->set(v, level);
     375          _queue[last++] = v;
     376        }
     377       
     378        for (InEdgeIt e(_graph, n); e != INVALID; ++e) {
     379          Node v = _graph.source(e);
     380          if ((*_level)[v] != -2) continue;
     381          Value rem = (*_capacity)[e] - (*_flow)[e];
     382          if (!_tolerance.positive(rem)) continue;
     383          _level->set(v, level);
     384          _queue[last++] = v;
     385        }
     386      }
    391387      return (*_level)[_source] != -2;
    392388    }
Note: See TracChangeset for help on using the changeset viewer.