gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge bugfix #372 to branch 1.2
0 1 0
merge 1.2
1 file changed with 24 insertions and 20 deletions:
↑ Collapse diff ↑
Ignore white space 48 line context
... ...
@@ -555,54 +555,60 @@
555 555
          if ((*_level)[v] == _level->maxLevel()) continue;
556 556
          _flow->set(e, 0);
557 557
          (*_excess)[v] += rem;
558 558
          if (v != _target && !_level->active(v)) {
559 559
            _level->activate(v);
560 560
          }
561 561
        }
562 562
      }
563 563
      return true;
564 564
    }
565 565

	
566 566
    /// \brief Starts the first phase of the preflow algorithm.
567 567
    ///
568 568
    /// The preflow algorithm consists of two phases, this method runs
569 569
    /// the first phase. After the first phase the maximum flow value
570 570
    /// and a minimum value cut can already be computed, although a
571 571
    /// maximum flow is not yet obtained. So after calling this method
572 572
    /// \ref flowValue() returns the value of a maximum flow and \ref
573 573
    /// minCut() returns a minimum cut.
574 574
    /// \pre One of the \ref init() functions must be called before
575 575
    /// using this function.
576 576
    void startFirstPhase() {
577 577
      _phase = true;
578 578

	
579
      Node n = _level->highestActive();
580
      int level = _level->highestActiveLevel();
581
      while (n != INVALID) {
579
      while (true) {
582 580
        int num = _node_num;
583 581

	
584
        while (num > 0 && n != INVALID) {
582
        Node n = INVALID;
583
        int level = -1;
584

	
585
        while (num > 0) {
586
          n = _level->highestActive();
587
          if (n == INVALID) goto first_phase_done;
588
          level = _level->highestActiveLevel();
589
          --num;
590
          
585 591
          Value excess = (*_excess)[n];
586 592
          int new_level = _level->maxLevel();
587 593

	
588 594
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
589 595
            Value rem = (*_capacity)[e] - (*_flow)[e];
590 596
            if (!_tolerance.positive(rem)) continue;
591 597
            Node v = _graph.target(e);
592 598
            if ((*_level)[v] < level) {
593 599
              if (!_level->active(v) && v != _target) {
594 600
                _level->activate(v);
595 601
              }
596 602
              if (!_tolerance.less(rem, excess)) {
597 603
                _flow->set(e, (*_flow)[e] + excess);
598 604
                (*_excess)[v] += excess;
599 605
                excess = 0;
600 606
                goto no_more_push_1;
601 607
              } else {
602 608
                excess -= rem;
603 609
                (*_excess)[v] += rem;
604 610
                _flow->set(e, (*_capacity)[e]);
605 611
              }
606 612
            } else if (new_level > (*_level)[v]) {
607 613
              new_level = (*_level)[v];
608 614
            }
... ...
@@ -626,56 +632,64 @@
626 632
                (*_excess)[v] += rem;
627 633
                _flow->set(e, 0);
628 634
              }
629 635
            } else if (new_level > (*_level)[v]) {
630 636
              new_level = (*_level)[v];
631 637
            }
632 638
          }
633 639

	
634 640
        no_more_push_1:
635 641

	
636 642
          (*_excess)[n] = excess;
637 643

	
638 644
          if (excess != 0) {
639 645
            if (new_level + 1 < _level->maxLevel()) {
640 646
              _level->liftHighestActive(new_level + 1);
641 647
            } else {
642 648
              _level->liftHighestActiveToTop();
643 649
            }
644 650
            if (_level->emptyLevel(level)) {
645 651
              _level->liftToTop(level);
646 652
            }
647 653
          } else {
648 654
            _level->deactivate(n);
649 655
          }
650

	
651
          n = _level->highestActive();
652
          level = _level->highestActiveLevel();
653
          --num;
654 656
        }
655 657

	
656 658
        num = _node_num * 20;
657
        while (num > 0 && n != INVALID) {
659
        while (num > 0) {
660
          while (level >= 0 && _level->activeFree(level)) {
661
            --level;
662
          }
663
          if (level == -1) {
664
            n = _level->highestActive();
665
            level = _level->highestActiveLevel();
666
            if (n == INVALID) goto first_phase_done;
667
          } else {
668
            n = _level->activeOn(level);
669
          }
670
          --num;
671

	
658 672
          Value excess = (*_excess)[n];
659 673
          int new_level = _level->maxLevel();
660 674

	
661 675
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
662 676
            Value rem = (*_capacity)[e] - (*_flow)[e];
663 677
            if (!_tolerance.positive(rem)) continue;
664 678
            Node v = _graph.target(e);
665 679
            if ((*_level)[v] < level) {
666 680
              if (!_level->active(v) && v != _target) {
667 681
                _level->activate(v);
668 682
              }
669 683
              if (!_tolerance.less(rem, excess)) {
670 684
                _flow->set(e, (*_flow)[e] + excess);
671 685
                (*_excess)[v] += excess;
672 686
                excess = 0;
673 687
                goto no_more_push_2;
674 688
              } else {
675 689
                excess -= rem;
676 690
                (*_excess)[v] += rem;
677 691
                _flow->set(e, (*_capacity)[e]);
678 692
              }
679 693
            } else if (new_level > (*_level)[v]) {
680 694
              new_level = (*_level)[v];
681 695
            }
... ...
@@ -699,61 +713,51 @@
699 713
                (*_excess)[v] += rem;
700 714
                _flow->set(e, 0);
701 715
              }
702 716
            } else if (new_level > (*_level)[v]) {
703 717
              new_level = (*_level)[v];
704 718
            }
705 719
          }
706 720

	
707 721
        no_more_push_2:
708 722

	
709 723
          (*_excess)[n] = excess;
710 724

	
711 725
          if (excess != 0) {
712 726
            if (new_level + 1 < _level->maxLevel()) {
713 727
              _level->liftActiveOn(level, new_level + 1);
714 728
            } else {
715 729
              _level->liftActiveToTop(level);
716 730
            }
717 731
            if (_level->emptyLevel(level)) {
718 732
              _level->liftToTop(level);
719 733
            }
720 734
          } else {
721 735
            _level->deactivate(n);
722 736
          }
723

	
724
          while (level >= 0 && _level->activeFree(level)) {
725
            --level;
726
          }
727
          if (level == -1) {
728
            n = _level->highestActive();
729
            level = _level->highestActiveLevel();
730
          } else {
731
            n = _level->activeOn(level);
732
          }
733
          --num;
734 737
        }
735 738
      }
739
    first_phase_done:;
736 740
    }
737 741

	
738 742
    /// \brief Starts the second phase of the preflow algorithm.
739 743
    ///
740 744
    /// The preflow algorithm consists of two phases, this method runs
741 745
    /// the second phase. After calling one of the \ref init() functions
742 746
    /// and \ref startFirstPhase() and then \ref startSecondPhase(),
743 747
    /// \ref flowMap() returns a maximum flow, \ref flowValue() returns the
744 748
    /// value of a maximum flow, \ref minCut() returns a minimum cut
745 749
    /// \pre One of the \ref init() functions and \ref startFirstPhase()
746 750
    /// must be called before using this function.
747 751
    void startSecondPhase() {
748 752
      _phase = false;
749 753

	
750 754
      typename Digraph::template NodeMap<bool> reached(_graph);
751 755
      for (NodeIt n(_graph); n != INVALID; ++n) {
752 756
        reached[n] = (*_level)[n] < _level->maxLevel();
753 757
      }
754 758

	
755 759
      _level->initStart();
756 760
      _level->initAddItem(_source);
757 761

	
758 762
      std::vector<Node> queue;
759 763
      queue.push_back(_source);
0 comments (0 inline)