gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Small bug fixes (#180)
0 2 0
default
2 files changed with 2 insertions and 2 deletions:
↑ Collapse diff ↑
Ignore white space 96 line context
... ...
@@ -636,97 +636,97 @@
636 636
      return _res_cap[_arc_idb[a]];
637 637
    }
638 638

	
639 639
    /// \brief Return the flow map (the primal solution).
640 640
    ///
641 641
    /// This function copies the flow value on each arc into the given
642 642
    /// map. The \c Value type of the algorithm must be convertible to
643 643
    /// the \c Value type of the map.
644 644
    ///
645 645
    /// \pre \ref run() must be called before using this function.
646 646
    template <typename FlowMap>
647 647
    void flowMap(FlowMap &map) const {
648 648
      for (ArcIt a(_graph); a != INVALID; ++a) {
649 649
        map.set(a, _res_cap[_arc_idb[a]]);
650 650
      }
651 651
    }
652 652

	
653 653
    /// \brief Return the potential (dual value) of the given node.
654 654
    ///
655 655
    /// This function returns the potential (dual value) of the
656 656
    /// given node.
657 657
    ///
658 658
    /// \pre \ref run() must be called before using this function.
659 659
    Cost potential(const Node& n) const {
660 660
      return _pi[_node_id[n]];
661 661
    }
662 662

	
663 663
    /// \brief Return the potential map (the dual solution).
664 664
    ///
665 665
    /// This function copies the potential (dual value) of each node
666 666
    /// into the given map.
667 667
    /// The \c Cost type of the algorithm must be convertible to the
668 668
    /// \c Value type of the map.
669 669
    ///
670 670
    /// \pre \ref run() must be called before using this function.
671 671
    template <typename PotentialMap>
672 672
    void potentialMap(PotentialMap &map) const {
673 673
      for (NodeIt n(_graph); n != INVALID; ++n) {
674 674
        map.set(n, _pi[_node_id[n]]);
675 675
      }
676 676
    }
677 677

	
678 678
    /// @}
679 679

	
680 680
  private:
681 681

	
682 682
    // Initialize the algorithm
683 683
    ProblemType init() {
684
      if (_node_num == 0) return INFEASIBLE;
684
      if (_node_num <= 1) return INFEASIBLE;
685 685

	
686 686
      // Check the sum of supply values
687 687
      _sum_supply = 0;
688 688
      for (int i = 0; i != _root; ++i) {
689 689
        _sum_supply += _supply[i];
690 690
      }
691 691
      if (_sum_supply > 0) return INFEASIBLE;
692 692
      
693 693
      // Initialize vectors
694 694
      for (int i = 0; i != _root; ++i) {
695 695
        _pi[i] = 0;
696 696
        _excess[i] = _supply[i];
697 697
      }
698 698

	
699 699
      // Remove non-zero lower bounds
700 700
      const Value MAX = std::numeric_limits<Value>::max();
701 701
      int last_out;
702 702
      if (_have_lower) {
703 703
        for (int i = 0; i != _root; ++i) {
704 704
          last_out = _first_out[i+1];
705 705
          for (int j = _first_out[i]; j != last_out; ++j) {
706 706
            if (_forward[j]) {
707 707
              Value c = _lower[j];
708 708
              if (c >= 0) {
709 709
                _res_cap[j] = _upper[j] < MAX ? _upper[j] - c : INF;
710 710
              } else {
711 711
                _res_cap[j] = _upper[j] < MAX + c ? _upper[j] - c : INF;
712 712
              }
713 713
              _excess[i] -= c;
714 714
              _excess[_target[j]] += c;
715 715
            } else {
716 716
              _res_cap[j] = 0;
717 717
            }
718 718
          }
719 719
        }
720 720
      } else {
721 721
        for (int j = 0; j != _res_arc_num; ++j) {
722 722
          _res_cap[j] = _forward[j] ? _upper[j] : 0;
723 723
        }
724 724
      }
725 725

	
726 726
      // Handle negative costs
727 727
      for (int i = 0; i != _root; ++i) {
728 728
        last_out = _first_out[i+1] - 1;
729 729
        for (int j = _first_out[i]; j != last_out; ++j) {
730 730
          Value rc = _res_cap[j];
731 731
          if (_cost[j] < 0 && rc > 0) {
732 732
            if (rc >= MAX) return UNBOUNDED;
Ignore white space 6 line context
... ...
@@ -667,97 +667,97 @@
667 667
      return _res_cap[_arc_idb[a]];
668 668
    }
669 669

	
670 670
    /// \brief Return the flow map (the primal solution).
671 671
    ///
672 672
    /// This function copies the flow value on each arc into the given
673 673
    /// map. The \c Value type of the algorithm must be convertible to
674 674
    /// the \c Value type of the map.
675 675
    ///
676 676
    /// \pre \ref run() must be called before using this function.
677 677
    template <typename FlowMap>
678 678
    void flowMap(FlowMap &map) const {
679 679
      for (ArcIt a(_graph); a != INVALID; ++a) {
680 680
        map.set(a, _res_cap[_arc_idb[a]]);
681 681
      }
682 682
    }
683 683

	
684 684
    /// \brief Return the potential (dual value) of the given node.
685 685
    ///
686 686
    /// This function returns the potential (dual value) of the
687 687
    /// given node.
688 688
    ///
689 689
    /// \pre \ref run() must be called before using this function.
690 690
    Cost potential(const Node& n) const {
691 691
      return static_cast<Cost>(_pi[_node_id[n]]);
692 692
    }
693 693

	
694 694
    /// \brief Return the potential map (the dual solution).
695 695
    ///
696 696
    /// This function copies the potential (dual value) of each node
697 697
    /// into the given map.
698 698
    /// The \c Cost type of the algorithm must be convertible to the
699 699
    /// \c Value type of the map.
700 700
    ///
701 701
    /// \pre \ref run() must be called before using this function.
702 702
    template <typename PotentialMap>
703 703
    void potentialMap(PotentialMap &map) const {
704 704
      for (NodeIt n(_graph); n != INVALID; ++n) {
705 705
        map.set(n, static_cast<Cost>(_pi[_node_id[n]]));
706 706
      }
707 707
    }
708 708

	
709 709
    /// @}
710 710

	
711 711
  private:
712 712

	
713 713
    // Initialize the algorithm
714 714
    ProblemType init() {
715
      if (_res_node_num == 0) return INFEASIBLE;
715
      if (_res_node_num <= 1) return INFEASIBLE;
716 716

	
717 717
      // Check the sum of supply values
718 718
      _sum_supply = 0;
719 719
      for (int i = 0; i != _root; ++i) {
720 720
        _sum_supply += _supply[i];
721 721
      }
722 722
      if (_sum_supply > 0) return INFEASIBLE;
723 723
      
724 724

	
725 725
      // Initialize vectors
726 726
      for (int i = 0; i != _res_node_num; ++i) {
727 727
        _pi[i] = 0;
728 728
        _excess[i] = _supply[i];
729 729
      }
730 730
      
731 731
      // Remove infinite upper bounds and check negative arcs
732 732
      const Value MAX = std::numeric_limits<Value>::max();
733 733
      int last_out;
734 734
      if (_have_lower) {
735 735
        for (int i = 0; i != _root; ++i) {
736 736
          last_out = _first_out[i+1];
737 737
          for (int j = _first_out[i]; j != last_out; ++j) {
738 738
            if (_forward[j]) {
739 739
              Value c = _scost[j] < 0 ? _upper[j] : _lower[j];
740 740
              if (c >= MAX) return UNBOUNDED;
741 741
              _excess[i] -= c;
742 742
              _excess[_target[j]] += c;
743 743
            }
744 744
          }
745 745
        }
746 746
      } else {
747 747
        for (int i = 0; i != _root; ++i) {
748 748
          last_out = _first_out[i+1];
749 749
          for (int j = _first_out[i]; j != last_out; ++j) {
750 750
            if (_forward[j] && _scost[j] < 0) {
751 751
              Value c = _upper[j];
752 752
              if (c >= MAX) return UNBOUNDED;
753 753
              _excess[i] -= c;
754 754
              _excess[_target[j]] += c;
755 755
            }
756 756
          }
757 757
        }
758 758
      }
759 759
      Value ex, max_cap = 0;
760 760
      for (int i = 0; i != _res_node_num; ++i) {
761 761
        ex = _excess[i];
762 762
        _excess[i] = 0;
763 763
        if (ex < 0) max_cap -= ex;
0 comments (0 inline)