Changes in lemon/min_cost_arborescence.h [672:029a48052c67:631:33c6b6e755cd] in lemon
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/min_cost_arborescence.h
r672 r631 37 37 /// Default traits class for MinCostArborescence class. 38 38 /// \param GR Digraph type. 39 /// \param CM Type of thecost map.39 /// \param CM Type of cost map. 40 40 template <class GR, class CM> 41 41 struct MinCostArborescenceDefaultTraits{ … … 47 47 /// 48 48 /// The type of the map that stores the arc costs. 49 /// It must conform tothe \ref concepts::ReadMap "ReadMap" concept.49 /// It must meet the \ref concepts::ReadMap "ReadMap" concept. 50 50 typedef CM CostMap; 51 51 … … 59 59 /// 60 60 /// The type of the map that stores which arcs are in the 61 /// arborescence. It must conform to the \ref concepts::WriteMap 62 /// "WriteMap" concept, and its value type must be \c bool 63 /// (or convertible). Initially it will be set to \c false on each 64 /// arc, then it will be set on each arborescence arc once. 61 /// arborescence. It must meet the \ref concepts::WriteMap 62 /// "WriteMap" concept. Initially it will be set to false on each 63 /// arc. After it will set all arborescence arcs once. 65 64 typedef typename Digraph::template ArcMap<bool> ArborescenceMap; 66 65 … … 68 67 /// 69 68 /// This function instantiates a \c ArborescenceMap. 70 /// \param digraph The digraph to which we would like to calculate71 /// the \c ArborescenceMap.69 /// \param digraph is the graph, to which we would like to 70 /// calculate the \c ArborescenceMap. 72 71 static ArborescenceMap *createArborescenceMap(const Digraph &digraph){ 73 72 return new ArborescenceMap(digraph); … … 76 75 /// \brief The type of the \c PredMap 77 76 /// 78 /// The type of the \c PredMap. It must confrom to the 79 /// \ref concepts::WriteMap "WriteMap" concept, and its value type 80 /// must be the \c Arc type of the digraph. 77 /// The type of the \c PredMap. It is a node map with an arc value type. 81 78 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap; 82 79 … … 96 93 /// \brief Minimum Cost Arborescence algorithm class. 97 94 /// 98 /// This class provides an efficient implementation of the95 /// This class provides an efficient implementation of 99 96 /// Minimum Cost Arborescence algorithm. The arborescence is a tree 100 97 /// which is directed from a given source node of the digraph. One or 101 /// more sources should be given tothe algorithm and it will calculate102 /// the minimum cost subgraph that is the union of arborescences with the98 /// more sources should be given for the algorithm and it will calculate 99 /// the minimum cost subgraph which are union of arborescences with the 103 100 /// given sources and spans all the nodes which are reachable from the 104 101 /// sources. The time complexity of the algorithm is O(n<sup>2</sup>+e). 105 102 /// 106 /// The algorithm also providesan optimal dual solution, therefore103 /// The algorithm provides also an optimal dual solution, therefore 107 104 /// the optimality of the solution can be checked. 108 105 /// 109 /// \param GR The digraph type the algorithm runs on. 110 /// \param CM A read-only arc map storing the costs of the 106 /// \param GR The digraph type the algorithm runs on. The default value 107 /// is \ref ListDigraph. 108 /// \param CM This read-only ArcMap determines the costs of the 111 109 /// arcs. It is read once for each arc, so the map may involve in 112 /// relatively time consuming process to compute the arc cost sif110 /// relatively time consuming process to compute the arc cost if 113 111 /// it is necessary. The default map type is \ref 114 112 /// concepts::Digraph::ArcMap "Digraph::ArcMap<int>". … … 116 114 /// by the algorithm. The default traits class is 117 115 /// \ref MinCostArborescenceDefaultTraits 118 /// "MinCostArborescenceDefaultTraits<GR, CM>". 116 /// "MinCostArborescenceDefaultTraits<GR, CM>". See \ref 117 /// MinCostArborescenceDefaultTraits for the documentation of a 118 /// MinCostArborescence traits class. 119 119 #ifndef DOXYGEN 120 template <typename GR ,120 template <typename GR = ListDigraph, 121 121 typename CM = typename GR::template ArcMap<int>, 122 122 typename TR = … … 128 128 public: 129 129 130 /// \brief The \ref MinCostArborescenceDefaultTraits "traits class" 131 /// of the algorithm. 130 /// The traits. 132 131 typedef TR Traits; 133 132 /// The type of the underlying digraph. … … 397 396 398 397 template <class T> 399 struct SetArborescenceMapTraits : public Traits {398 struct DefArborescenceMapTraits : public Traits { 400 399 typedef T ArborescenceMap; 401 400 static ArborescenceMap *createArborescenceMap(const Digraph &) … … 407 406 408 407 /// \brief \ref named-templ-param "Named parameter" for 409 /// setting \cArborescenceMap type408 /// setting ArborescenceMap type 410 409 /// 411 410 /// \ref named-templ-param "Named parameter" for setting 412 /// \c ArborescenceMap type. 413 /// It must conform to the \ref concepts::WriteMap "WriteMap" concept, 414 /// and its value type must be \c bool (or convertible). 415 /// Initially it will be set to \c false on each arc, 416 /// then it will be set on each arborescence arc once. 411 /// ArborescenceMap type 417 412 template <class T> 418 struct SetArborescenceMap413 struct DefArborescenceMap 419 414 : public MinCostArborescence<Digraph, CostMap, 420 SetArborescenceMapTraits<T> > {415 DefArborescenceMapTraits<T> > { 421 416 }; 422 417 423 418 template <class T> 424 struct SetPredMapTraits : public Traits {419 struct DefPredMapTraits : public Traits { 425 420 typedef T PredMap; 426 421 static PredMap *createPredMap(const Digraph &) 427 422 { 428 423 LEMON_ASSERT(false, "PredMap is not initialized"); 429 return 0; // ignore warnings430 424 } 431 425 }; 432 426 433 427 /// \brief \ref named-templ-param "Named parameter" for 434 /// setting \cPredMap type428 /// setting PredMap type 435 429 /// 436 430 /// \ref named-templ-param "Named parameter" for setting 437 /// \c PredMap type. 438 /// It must meet the \ref concepts::WriteMap "WriteMap" concept, 439 /// and its value type must be the \c Arc type of the digraph. 431 /// PredMap type 440 432 template <class T> 441 struct SetPredMap442 : public MinCostArborescence<Digraph, CostMap, SetPredMapTraits<T> > {433 struct DefPredMap 434 : public MinCostArborescence<Digraph, CostMap, DefPredMapTraits<T> > { 443 435 }; 444 436 … … 473 465 } 474 466 475 /// \brief Sets the predecessormap.476 /// 477 /// Sets the predecessormap.467 /// \brief Sets the arborescence map. 468 /// 469 /// Sets the arborescence map. 478 470 /// \return <tt>(*this)</tt> 479 471 MinCostArborescence& predMap(PredMap& m) { … … 485 477 return *this; 486 478 } 479 480 /// \name Query Functions 481 /// The result of the %MinCostArborescence algorithm can be obtained 482 /// using these functions.\n 483 /// Before the use of these functions, 484 /// either run() or start() must be called. 485 486 /// @{ 487 488 /// \brief Returns a reference to the arborescence map. 489 /// 490 /// Returns a reference to the arborescence map. 491 const ArborescenceMap& arborescenceMap() const { 492 return *_arborescence; 493 } 494 495 /// \brief Returns true if the arc is in the arborescence. 496 /// 497 /// Returns true if the arc is in the arborescence. 498 /// \param arc The arc of the digraph. 499 /// \pre \ref run() must be called before using this function. 500 bool arborescence(Arc arc) const { 501 return (*_pred)[_digraph->target(arc)] == arc; 502 } 503 504 /// \brief Returns a reference to the pred map. 505 /// 506 /// Returns a reference to the pred map. 507 const PredMap& predMap() const { 508 return *_pred; 509 } 510 511 /// \brief Returns the predecessor arc of the given node. 512 /// 513 /// Returns the predecessor arc of the given node. 514 Arc pred(Node node) const { 515 return (*_pred)[node]; 516 } 517 518 /// \brief Returns the cost of the arborescence. 519 /// 520 /// Returns the cost of the arborescence. 521 Value arborescenceValue() const { 522 Value sum = 0; 523 for (ArcIt it(*_digraph); it != INVALID; ++it) { 524 if (arborescence(it)) { 525 sum += (*_cost)[it]; 526 } 527 } 528 return sum; 529 } 530 531 /// \brief Indicates that a node is reachable from the sources. 532 /// 533 /// Indicates that a node is reachable from the sources. 534 bool reached(Node node) const { 535 return (*_node_order)[node] != -3; 536 } 537 538 /// \brief Indicates that a node is processed. 539 /// 540 /// Indicates that a node is processed. The arborescence path exists 541 /// from the source to the given node. 542 bool processed(Node node) const { 543 return (*_node_order)[node] == -1; 544 } 545 546 /// \brief Returns the number of the dual variables in basis. 547 /// 548 /// Returns the number of the dual variables in basis. 549 int dualNum() const { 550 return _dual_variables.size(); 551 } 552 553 /// \brief Returns the value of the dual solution. 554 /// 555 /// Returns the value of the dual solution. It should be 556 /// equal to the arborescence value. 557 Value dualValue() const { 558 Value sum = 0; 559 for (int i = 0; i < int(_dual_variables.size()); ++i) { 560 sum += _dual_variables[i].value; 561 } 562 return sum; 563 } 564 565 /// \brief Returns the number of the nodes in the dual variable. 566 /// 567 /// Returns the number of the nodes in the dual variable. 568 int dualSize(int k) const { 569 return _dual_variables[k].end - _dual_variables[k].begin; 570 } 571 572 /// \brief Returns the value of the dual variable. 573 /// 574 /// Returns the the value of the dual variable. 575 const Value& dualValue(int k) const { 576 return _dual_variables[k].value; 577 } 578 579 /// \brief Lemon iterator for get a dual variable. 580 /// 581 /// Lemon iterator for get a dual variable. This class provides 582 /// a common style lemon iterator which gives back a subset of 583 /// the nodes. 584 class DualIt { 585 public: 586 587 /// \brief Constructor. 588 /// 589 /// Constructor for get the nodeset of the variable. 590 DualIt(const MinCostArborescence& algorithm, int variable) 591 : _algorithm(&algorithm) 592 { 593 _index = _algorithm->_dual_variables[variable].begin; 594 _last = _algorithm->_dual_variables[variable].end; 595 } 596 597 /// \brief Conversion to node. 598 /// 599 /// Conversion to node. 600 operator Node() const { 601 return _algorithm->_dual_node_list[_index]; 602 } 603 604 /// \brief Increment operator. 605 /// 606 /// Increment operator. 607 DualIt& operator++() { 608 ++_index; 609 return *this; 610 } 611 612 /// \brief Validity checking 613 /// 614 /// Checks whether the iterator is invalid. 615 bool operator==(Invalid) const { 616 return _index == _last; 617 } 618 619 /// \brief Validity checking 620 /// 621 /// Checks whether the iterator is valid. 622 bool operator!=(Invalid) const { 623 return _index != _last; 624 } 625 626 private: 627 const MinCostArborescence* _algorithm; 628 int _index, _last; 629 }; 630 631 /// @} 487 632 488 633 /// \name Execution Control … … 545 690 /// \return The processed node. 546 691 /// 547 /// \warning The queue must not be empty .692 /// \warning The queue must not be empty! 548 693 Node processNextNode() { 549 694 Node node = queue.back(); … … 568 713 /// \brief Returns the number of the nodes to be processed. 569 714 /// 570 /// Returns the number of the nodes to be processed in the priority 571 /// queue. 715 /// Returns the number of the nodes to be processed. 572 716 int queueSize() const { 573 717 return queue.size(); … … 611 755 /// mca.start(); 612 756 /// \endcode 613 void run(Node s) {757 void run(Node node) { 614 758 init(); 615 addSource( s);759 addSource(node); 616 760 start(); 617 761 } 618 762 619 763 ///@} 620 621 /// \name Query Functions622 /// The result of the %MinCostArborescence algorithm can be obtained623 /// using these functions.\n624 /// Either run() or start() must be called before using them.625 626 /// @{627 628 /// \brief Returns the cost of the arborescence.629 ///630 /// Returns the cost of the arborescence.631 Value arborescenceCost() const {632 Value sum = 0;633 for (ArcIt it(*_digraph); it != INVALID; ++it) {634 if (arborescence(it)) {635 sum += (*_cost)[it];636 }637 }638 return sum;639 }640 641 /// \brief Returns \c true if the arc is in the arborescence.642 ///643 /// Returns \c true if the given arc is in the arborescence.644 /// \param arc An arc of the digraph.645 /// \pre \ref run() must be called before using this function.646 bool arborescence(Arc arc) const {647 return (*_pred)[_digraph->target(arc)] == arc;648 }649 650 /// \brief Returns a const reference to the arborescence map.651 ///652 /// Returns a const reference to the arborescence map.653 /// \pre \ref run() must be called before using this function.654 const ArborescenceMap& arborescenceMap() const {655 return *_arborescence;656 }657 658 /// \brief Returns the predecessor arc of the given node.659 ///660 /// Returns the predecessor arc of the given node.661 /// \pre \ref run() must be called before using this function.662 Arc pred(Node node) const {663 return (*_pred)[node];664 }665 666 /// \brief Returns a const reference to the pred map.667 ///668 /// Returns a const reference to the pred map.669 /// \pre \ref run() must be called before using this function.670 const PredMap& predMap() const {671 return *_pred;672 }673 674 /// \brief Indicates that a node is reachable from the sources.675 ///676 /// Indicates that a node is reachable from the sources.677 bool reached(Node node) const {678 return (*_node_order)[node] != -3;679 }680 681 /// \brief Indicates that a node is processed.682 ///683 /// Indicates that a node is processed. The arborescence path exists684 /// from the source to the given node.685 bool processed(Node node) const {686 return (*_node_order)[node] == -1;687 }688 689 /// \brief Returns the number of the dual variables in basis.690 ///691 /// Returns the number of the dual variables in basis.692 int dualNum() const {693 return _dual_variables.size();694 }695 696 /// \brief Returns the value of the dual solution.697 ///698 /// Returns the value of the dual solution. It should be699 /// equal to the arborescence value.700 Value dualValue() const {701 Value sum = 0;702 for (int i = 0; i < int(_dual_variables.size()); ++i) {703 sum += _dual_variables[i].value;704 }705 return sum;706 }707 708 /// \brief Returns the number of the nodes in the dual variable.709 ///710 /// Returns the number of the nodes in the dual variable.711 int dualSize(int k) const {712 return _dual_variables[k].end - _dual_variables[k].begin;713 }714 715 /// \brief Returns the value of the dual variable.716 ///717 /// Returns the the value of the dual variable.718 Value dualValue(int k) const {719 return _dual_variables[k].value;720 }721 722 /// \brief LEMON iterator for getting a dual variable.723 ///724 /// This class provides a common style LEMON iterator for getting a725 /// dual variable of \ref MinCostArborescence algorithm.726 /// It iterates over a subset of the nodes.727 class DualIt {728 public:729 730 /// \brief Constructor.731 ///732 /// Constructor for getting the nodeset of the dual variable733 /// of \ref MinCostArborescence algorithm.734 DualIt(const MinCostArborescence& algorithm, int variable)735 : _algorithm(&algorithm)736 {737 _index = _algorithm->_dual_variables[variable].begin;738 _last = _algorithm->_dual_variables[variable].end;739 }740 741 /// \brief Conversion to \c Node.742 ///743 /// Conversion to \c Node.744 operator Node() const {745 return _algorithm->_dual_node_list[_index];746 }747 748 /// \brief Increment operator.749 ///750 /// Increment operator.751 DualIt& operator++() {752 ++_index;753 return *this;754 }755 756 /// \brief Validity checking757 ///758 /// Checks whether the iterator is invalid.759 bool operator==(Invalid) const {760 return _index == _last;761 }762 763 /// \brief Validity checking764 ///765 /// Checks whether the iterator is valid.766 bool operator!=(Invalid) const {767 return _index != _last;768 }769 770 private:771 const MinCostArborescence* _algorithm;772 int _index, _last;773 };774 775 /// @}776 764 777 765 }; … … 782 770 /// 783 771 /// Function type interface for MinCostArborescence algorithm. 784 /// \param digraph The digraph the algorithm runs on. 785 /// \param cost An arc map storing the costs. 786 /// \param source The source node of the arborescence. 787 /// \retval arborescence An arc map with \c bool (or convertible) value 788 /// type that stores the arborescence. 789 /// \return The total cost of the arborescence. 772 /// \param digraph The Digraph that the algorithm runs on. 773 /// \param cost The CostMap of the arcs. 774 /// \param source The source of the arborescence. 775 /// \retval arborescence The bool ArcMap which stores the arborescence. 776 /// \return The cost of the arborescence. 790 777 /// 791 778 /// \sa MinCostArborescence … … 796 783 ArborescenceMap& arborescence) { 797 784 typename MinCostArborescence<Digraph, CostMap> 798 ::template SetArborescenceMap<ArborescenceMap>785 ::template DefArborescenceMap<ArborescenceMap> 799 786 ::Create mca(digraph, cost); 800 787 mca.arborescenceMap(arborescence); 801 788 mca.run(source); 802 return mca.arborescence Cost();789 return mca.arborescenceValue(); 803 790 } 804 791
Note: See TracChangeset
for help on using the changeset viewer.