gravatar
deba@inf.elte.hu
deba@inf.elte.hu
New queue implementation for HaoOrlin class (#58)
0 1 0
default
1 file changed with 47 insertions and 66 deletions:
↑ Collapse diff ↑
Ignore white space 24 line context
... ...
@@ -216,75 +216,65 @@
216 216
    }
217 217

	
218 218
    void findMinCutOut() {
219 219

	
220 220
      for (NodeIt n(_graph); n != INVALID; ++n) {
221 221
        _excess->set(n, 0);
222 222
      }
223 223

	
224 224
      for (ArcIt a(_graph); a != INVALID; ++a) {
225 225
        _flow->set(a, 0);
226 226
      }
227 227

	
228
      int bucket_num = 1;
228
      int bucket_num = 0;
229
      std::vector<Node> queue(_node_num);
230
      int qfirst = 0, qlast = 0, qsep = 0;
229 231

	
230 232
      {
231 233
        typename Digraph::template NodeMap<bool> reached(_graph, false);
232 234

	
233 235
        reached.set(_source, true);
234

	
235 236
        bool first_set = true;
236 237

	
237 238
        for (NodeIt t(_graph); t != INVALID; ++t) {
238 239
          if (reached[t]) continue;
239 240
          _sets.push_front(std::list<int>());
240
          _sets.front().push_front(bucket_num);
241
          _dormant[bucket_num] = !first_set;
242

	
243
          _bucket->set(t, bucket_num);
244
          _first[bucket_num] = _last[bucket_num] = t;
245
          _next->set(t, INVALID);
246
          _prev->set(t, INVALID);
247

	
248
          ++bucket_num;
249

	
250
          std::vector<Node> queue;
251
          queue.push_back(t);
241
          
242
          queue[qlast++] = t;
252 243
          reached.set(t, true);
253 244

	
254
          while (!queue.empty()) {
255
            _sets.front().push_front(bucket_num);
256
            _dormant[bucket_num] = !first_set;
257
            _first[bucket_num] = _last[bucket_num] = INVALID;
245
          while (qfirst != qlast) {
246
            if (qsep == qfirst) {
247
              ++bucket_num;
248
              _sets.front().push_front(bucket_num);
249
              _dormant[bucket_num] = !first_set;
250
              _first[bucket_num] = _last[bucket_num] = INVALID;
251
              qsep = qlast;
252
            }
258 253

	
259
            std::vector<Node> nqueue;
260
            for (int i = 0; i < int(queue.size()); ++i) {
261
              Node n = queue[i];
262
              for (InArcIt a(_graph, n); a != INVALID; ++a) {
263
                Node u = _graph.source(a);
264
                if (!reached[u] && _tolerance.positive((*_capacity)[a])) {
265
                  reached.set(u, true);
266
                  addItem(u, bucket_num);
267
                  nqueue.push_back(u);
268
                }
254
            Node n = queue[qfirst++];
255
            addItem(n, bucket_num);
256

	
257
            for (InArcIt a(_graph, n); a != INVALID; ++a) {
258
              Node u = _graph.source(a);
259
              if (!reached[u] && _tolerance.positive((*_capacity)[a])) {
260
                reached.set(u, true);
261
                queue[qlast++] = u;
269 262
              }
270 263
            }
271
            queue.swap(nqueue);
272
            ++bucket_num;
273 264
          }
274
          _sets.front().pop_front();
275
          --bucket_num;
276 265
          first_set = false;
277 266
        }
278 267

	
268
        ++bucket_num;
279 269
        _bucket->set(_source, 0);
280 270
        _dormant[0] = true;
281 271
      }
282 272
      _source_set->set(_source, true);
283 273

	
284 274
      Node target = _last[_sets.back().back()];
285 275
      {
286 276
        for (OutArcIt a(_graph, _source); a != INVALID; ++a) {
287 277
          if (_tolerance.positive((*_capacity)[a])) {
288 278
            Node u = _graph.target(a);
289 279
            _flow->set(a, (*_capacity)[a]);
290 280
            _excess->set(u, (*_excess)[u] + (*_capacity)[a]);
... ...
@@ -525,75 +515,66 @@
525 515
    }
526 516

	
527 517
    void findMinCutIn() {
528 518

	
529 519
      for (NodeIt n(_graph); n != INVALID; ++n) {
530 520
        _excess->set(n, 0);
531 521
      }
532 522

	
533 523
      for (ArcIt a(_graph); a != INVALID; ++a) {
534 524
        _flow->set(a, 0);
535 525
      }
536 526

	
537
      int bucket_num = 1;
527
      int bucket_num = 0;
528
      std::vector<Node> queue(_node_num);
529
      int qfirst = 0, qlast = 0, qsep = 0;
538 530

	
539 531
      {
540 532
        typename Digraph::template NodeMap<bool> reached(_graph, false);
541 533

	
542 534
        reached.set(_source, true);
543 535

	
544 536
        bool first_set = true;
545 537

	
546 538
        for (NodeIt t(_graph); t != INVALID; ++t) {
547 539
          if (reached[t]) continue;
548 540
          _sets.push_front(std::list<int>());
549
          _sets.front().push_front(bucket_num);
550
          _dormant[bucket_num] = !first_set;
551

	
552
          _bucket->set(t, bucket_num);
553
          _first[bucket_num] = _last[bucket_num] = t;
554
          _next->set(t, INVALID);
555
          _prev->set(t, INVALID);
556

	
557
          ++bucket_num;
558

	
559
          std::vector<Node> queue;
560
          queue.push_back(t);
541
          
542
          queue[qlast++] = t;
561 543
          reached.set(t, true);
562 544

	
563
          while (!queue.empty()) {
564
            _sets.front().push_front(bucket_num);
565
            _dormant[bucket_num] = !first_set;
566
            _first[bucket_num] = _last[bucket_num] = INVALID;
545
          while (qfirst != qlast) {
546
            if (qsep == qfirst) {
547
              ++bucket_num;
548
              _sets.front().push_front(bucket_num);
549
              _dormant[bucket_num] = !first_set;
550
              _first[bucket_num] = _last[bucket_num] = INVALID;
551
              qsep = qlast;
552
            }
567 553

	
568
            std::vector<Node> nqueue;
569
            for (int i = 0; i < int(queue.size()); ++i) {
570
              Node n = queue[i];
571
              for (OutArcIt a(_graph, n); a != INVALID; ++a) {
572
                Node u = _graph.target(a);
573
                if (!reached[u] && _tolerance.positive((*_capacity)[a])) {
574
                  reached.set(u, true);
575
                  addItem(u, bucket_num);
576
                  nqueue.push_back(u);
577
                }
554
            Node n = queue[qfirst++];
555
            addItem(n, bucket_num);
556

	
557
            for (OutArcIt a(_graph, n); a != INVALID; ++a) {
558
              Node u = _graph.target(a);
559
              if (!reached[u] && _tolerance.positive((*_capacity)[a])) {
560
                reached.set(u, true);
561
                queue[qlast++] = u;
578 562
              }
579 563
            }
580
            queue.swap(nqueue);
581
            ++bucket_num;
582 564
          }
583
          _sets.front().pop_front();
584
          --bucket_num;
585 565
          first_set = false;
586 566
        }
587 567

	
568
        ++bucket_num;
588 569
        _bucket->set(_source, 0);
589 570
        _dormant[0] = true;
590 571
      }
591 572
      _source_set->set(_source, true);
592 573

	
593 574
      Node target = _last[_sets.back().back()];
594 575
      {
595 576
        for (InArcIt a(_graph, _source); a != INVALID; ++a) {
596 577
          if (_tolerance.positive((*_capacity)[a])) {
597 578
            Node u = _graph.source(a);
598 579
            _flow->set(a, (*_capacity)[a]);
599 580
            _excess->set(u, (*_excess)[u] + (*_capacity)[a]);
... ...
@@ -855,28 +836,28 @@
855 836

	
856 837
    /// \brief Initializes the internal data structures.
857 838
    ///
858 839
    /// Initializes the internal data structures. It creates
859 840
    /// the maps, residual graph adaptor and some bucket structures
860 841
    /// for the algorithm. Node \c source  is used as the push-relabel
861 842
    /// algorithm's source.
862 843
    void init(const Node& source) {
863 844
      _source = source;
864 845

	
865 846
      _node_num = countNodes(_graph);
866 847

	
867
      _first.resize(_node_num + 1);
868
      _last.resize(_node_num + 1);
848
      _first.resize(_node_num);
849
      _last.resize(_node_num);
869 850

	
870
      _dormant.resize(_node_num + 1);
851
      _dormant.resize(_node_num);
871 852

	
872 853
      if (!_flow) {
873 854
        _flow = new FlowMap(_graph);
874 855
      }
875 856
      if (!_next) {
876 857
        _next = new typename Digraph::template NodeMap<Node>(_graph);
877 858
      }
878 859
      if (!_prev) {
879 860
        _prev = new typename Digraph::template NodeMap<Node>(_graph);
880 861
      }
881 862
      if (!_active) {
882 863
        _active = new typename Digraph::template NodeMap<bool>(_graph);
0 comments (0 inline)