Changeset 2519:a7376f7ed899 in lemon-0.x for lemon/dinitz_sleator_tarjan.h
- Timestamp:
- 11/21/07 14:35:10 (17 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@3395
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/dinitz_sleator_tarjan.h
r2514 r2519 25 25 /// and Tarjan. 26 26 27 #include <lemon/time_measure.h>28 #include <queue>29 27 #include <lemon/graph_utils.h> 30 28 #include <lemon/tolerance.h> 31 #include <lemon/graph_adaptor.h>32 #include <lemon/bfs.h>33 #include <lemon/edge_set.h>34 29 #include <lemon/dynamic_tree.h> 35 30 … … 161 156 DynTree* _dt; 162 157 158 std::vector<Node> _queue; 159 163 160 Tolerance _tolerance; 164 161 … … 230 227 _flow(0), _local_flow(false), 231 228 _level(0), _dt_edges(0), 232 _dt_index(0), _dt(0), 229 _dt_index(0), _dt(0), _queue(), 233 230 _tolerance(), _flow_value(), _max_value() 234 231 { … … 327 324 _dt_edges = new EdgeNodeMap(_graph); 328 325 } 326 _queue.resize(countNodes(_graph)); 329 327 _max_value = _dt->maxValue(); 330 328 } … … 356 354 int level = 0; 357 355 358 std::vector<Node> queue; 359 queue.push_back(_target); 356 _queue[0] = _target; 360 357 _level->set(_target, level); 358 359 int first = 0, last = 1, limit = 0; 361 360 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 } 365 366 366 for (int i = 0; i < int(queue.size()); ++i) { 367 Node n = queue[i]; 367 Node n = _queue[first++]; 368 368 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 } 391 387 return (*_level)[_source] != -2; 392 388 }
Note: See TracChangeset
for help on using the changeset viewer.