37 |
37 |
38 /// \ingroup matching |
38 /// \ingroup matching |
39 /// |
39 /// |
40 /// \brief Edmonds' alternating forest maximum matching algorithm. |
40 /// \brief Edmonds' alternating forest maximum matching algorithm. |
41 /// |
41 /// |
42 /// This class provides Edmonds' alternating forest matching |
42 /// This class implements Edmonds' alternating forest matching |
43 /// algorithm. The starting matching (if any) can be passed to the |
43 /// algorithm. The algorithm can be started from an arbitrary initial |
44 /// algorithm using some of init functions. |
44 /// matching (the default is the empty one) |
45 /// |
45 /// |
46 /// The dual side of a matching is a map of the nodes to |
46 /// The dual solution of the problem is a map of the nodes to |
47 /// MaxMatching::Status, having values \c EVEN/D, \c ODD/A and \c |
47 /// MaxMatching::Status, having values \c EVEN/D, \c ODD/A and \c |
48 /// MATCHED/C showing the Gallai-Edmonds decomposition of the |
48 /// MATCHED/C showing the Gallai-Edmonds decomposition of the |
49 /// graph. The nodes in \c EVEN/D induce a graph with |
49 /// graph. The nodes in \c EVEN/D induce a graph with |
50 /// factor-critical components, the nodes in \c ODD/A form the |
50 /// factor-critical components, the nodes in \c ODD/A form the |
51 /// barrier, and the nodes in \c MATCHED/C induce a graph having a |
51 /// barrier, and the nodes in \c MATCHED/C induce a graph having a |
52 /// perfect matching. The number of the fractor critical components |
52 /// perfect matching. The number of the factor-critical components |
53 /// minus the number of barrier nodes is a lower bound on the |
53 /// minus the number of barrier nodes is a lower bound on the |
54 /// unmatched nodes, and if the matching is optimal this bound is |
54 /// unmatched nodes, and the matching is optimal if and only if this bound is |
55 /// tight. This decomposition can be attained by calling \c |
55 /// tight. This decomposition can be attained by calling \c |
56 /// decomposition() after running the algorithm. |
56 /// decomposition() after running the algorithm. |
57 /// |
57 /// |
58 /// \param _Graph The graph type the algorithm runs on. |
58 /// \param _Graph The graph type the algorithm runs on. |
59 template <typename _Graph> |
59 template <typename _Graph> |
64 typedef typename Graph::template NodeMap<typename Graph::Arc> |
64 typedef typename Graph::template NodeMap<typename Graph::Arc> |
65 MatchingMap; |
65 MatchingMap; |
66 |
66 |
67 ///\brief Indicates the Gallai-Edmonds decomposition of the graph. |
67 ///\brief Indicates the Gallai-Edmonds decomposition of the graph. |
68 /// |
68 /// |
69 ///Indicates the Gallai-Edmonds decomposition of the graph, which |
69 ///Indicates the Gallai-Edmonds decomposition of the graph. The |
70 ///shows an upper bound on the size of a maximum matching. The |
|
71 ///nodes with Status \c EVEN/D induce a graph with factor-critical |
70 ///nodes with Status \c EVEN/D induce a graph with factor-critical |
72 ///components, the nodes in \c ODD/A form the canonical barrier, |
71 ///components, the nodes in \c ODD/A form the canonical barrier, |
73 ///and the nodes in \c MATCHED/C induce a graph having a perfect |
72 ///and the nodes in \c MATCHED/C induce a graph having a perfect |
74 ///matching. |
73 ///matching. |
75 enum Status { |
74 enum Status { |
408 ~MaxMatching() { |
407 ~MaxMatching() { |
409 destroyStructures(); |
408 destroyStructures(); |
410 } |
409 } |
411 |
410 |
412 /// \name Execution control |
411 /// \name Execution control |
413 /// The simplest way to execute the algorithm is to use the member |
412 /// The simplest way to execute the algorithm is to use the |
414 /// \c run() member function. |
413 /// \c run() member function. |
415 /// \n |
414 /// \n |
416 |
415 |
417 /// If you need more control on the execution, first you must call |
416 /// If you need better control on the execution, you must call |
418 /// \ref init(), \ref greedyInit() or \ref matchingInit() |
417 /// \ref init(), \ref greedyInit() or \ref matchingInit() |
419 /// functions, then you can start the algorithm with the \ref |
418 /// functions first, then you can start the algorithm with the \ref |
420 /// startParse() or startDense() functions. |
419 /// startParse() or startDense() functions. |
421 |
420 |
422 ///@{ |
421 ///@{ |
423 |
422 |
424 /// \brief Sets the actual matching to the empty matching. |
423 /// \brief Sets the actual matching to the empty matching. |
431 _matching->set(n, INVALID); |
430 _matching->set(n, INVALID); |
432 _status->set(n, UNMATCHED); |
431 _status->set(n, UNMATCHED); |
433 } |
432 } |
434 } |
433 } |
435 |
434 |
436 ///\brief Finds a greedy matching for initial matching. |
435 ///\brief Finds an initial matching in a greedy way |
437 /// |
436 /// |
438 ///For initial matchig it finds a maximal greedy matching. |
437 ///It finds an initial matching in a greedy way. |
439 void greedyInit() { |
438 void greedyInit() { |
440 createStructures(); |
439 createStructures(); |
441 for (NodeIt n(_graph); n != INVALID; ++n) { |
440 for (NodeIt n(_graph); n != INVALID; ++n) { |
442 _matching->set(n, INVALID); |
441 _matching->set(n, INVALID); |
443 _status->set(n, UNMATCHED); |
442 _status->set(n, UNMATCHED); |
457 } |
456 } |
458 } |
457 } |
459 } |
458 } |
460 |
459 |
461 |
460 |
462 /// \brief Initialize the matching from the map containing a matching. |
461 /// \brief Initialize the matching from a map containing. |
463 /// |
462 /// |
464 /// Initialize the matching from a \c bool valued \c Edge map. This |
463 /// Initialize the matching from a \c bool valued \c Edge map. This |
465 /// map must have the property that there are no two incident edges |
464 /// map must have the property that there are no two incident edges |
466 /// with true value, ie. it contains a matching. |
465 /// with true value, ie. it contains a matching. |
467 /// \return %True if the map contains a matching. |
466 /// \return %True if the map contains a matching. |
505 } |
504 } |
506 |
505 |
507 /// \brief Starts Edmonds' algorithm. |
506 /// \brief Starts Edmonds' algorithm. |
508 /// |
507 /// |
509 /// It runs Edmonds' algorithm with a heuristic of postponing |
508 /// It runs Edmonds' algorithm with a heuristic of postponing |
510 /// shrinks, giving a faster algorithm for dense graphs. |
509 /// shrinks, therefore resulting in a faster algorithm for dense graphs. |
511 void startDense() { |
510 void startDense() { |
512 for(NodeIt n(_graph); n != INVALID; ++n) { |
511 for(NodeIt n(_graph); n != INVALID; ++n) { |
513 if ((*_status)[n] == UNMATCHED) { |
512 if ((*_status)[n] == UNMATCHED) { |
514 (*_blossom_rep)[_blossom_set->insert(n)] = n; |
513 (*_blossom_rep)[_blossom_set->insert(n)] = n; |
515 _tree_set->insert(n); |
514 _tree_set->insert(n); |
536 } |
535 } |
537 |
536 |
538 /// @} |
537 /// @} |
539 |
538 |
540 /// \name Primal solution |
539 /// \name Primal solution |
541 /// Functions for get the primal solution, ie. the matching. |
540 /// Functions to get the primal solution, ie. the matching. |
542 |
541 |
543 /// @{ |
542 /// @{ |
544 |
543 |
545 ///\brief Returns the size of the actual matching stored. |
544 ///\brief Returns the size of the current matching. |
546 /// |
545 /// |
547 ///Returns the size of the actual matching stored. After \ref |
546 ///Returns the size of the current matching. After \ref |
548 ///run() it returns the size of the maximum matching in the graph. |
547 ///run() it returns the size of the maximum matching in the graph. |
549 int matchingSize() const { |
548 int matchingSize() const { |
550 int size = 0; |
549 int size = 0; |
551 for (NodeIt n(_graph); n != INVALID; ++n) { |
550 for (NodeIt n(_graph); n != INVALID; ++n) { |
552 if ((*_matching)[n] != INVALID) { |
551 if ((*_matching)[n] != INVALID) { |
643 /// The algorithm can be executed with \c run() or the \c init() and |
642 /// The algorithm can be executed with \c run() or the \c init() and |
644 /// then the \c start() member functions. After it the matching can |
643 /// then the \c start() member functions. After it the matching can |
645 /// be asked with \c matching() or mate() functions. The dual |
644 /// be asked with \c matching() or mate() functions. The dual |
646 /// solution can be get with \c nodeValue(), \c blossomNum() and \c |
645 /// solution can be get with \c nodeValue(), \c blossomNum() and \c |
647 /// blossomValue() members and \ref MaxWeightedMatching::BlossomIt |
646 /// blossomValue() members and \ref MaxWeightedMatching::BlossomIt |
648 /// "BlossomIt" nested class which is able to iterate on the nodes |
647 /// "BlossomIt" nested class, which is able to iterate on the nodes |
649 /// of a blossom. If the value type is integral then the dual |
648 /// of a blossom. If the value type is integral then the dual |
650 /// solution is multiplied by \ref MaxWeightedMatching::dualScale "4". |
649 /// solution is multiplied by \ref MaxWeightedMatching::dualScale "4". |
651 template <typename _Graph, |
650 template <typename _Graph, |
652 typename _WeightMap = typename _Graph::template EdgeMap<int> > |
651 typename _WeightMap = typename _Graph::template EdgeMap<int> > |
653 class MaxWeightedMatching { |
652 class MaxWeightedMatching { |
1628 ~MaxWeightedMatching() { |
1627 ~MaxWeightedMatching() { |
1629 destroyStructures(); |
1628 destroyStructures(); |
1630 } |
1629 } |
1631 |
1630 |
1632 /// \name Execution control |
1631 /// \name Execution control |
1633 /// The simplest way to execute the algorithm is to use the member |
1632 /// The simplest way to execute the algorithm is to use the |
1634 /// \c run() member function. |
1633 /// \c run() member function. |
1635 |
1634 |
1636 ///@{ |
1635 ///@{ |
1637 |
1636 |
1638 /// \brief Initialize the algorithm |
1637 /// \brief Initialize the algorithm |
1789 } |
1788 } |
1790 |
1789 |
1791 /// @} |
1790 /// @} |
1792 |
1791 |
1793 /// \name Primal solution |
1792 /// \name Primal solution |
1794 /// Functions for get the primal solution, ie. the matching. |
1793 /// Functions to get the primal solution, ie. the matching. |
1795 |
1794 |
1796 /// @{ |
1795 /// @{ |
1797 |
1796 |
1798 /// \brief Returns the matching value. |
1797 /// \brief Returns the weight of the matching. |
1799 /// |
1798 /// |
1800 /// Returns the matching value. |
1799 /// Returns the weight of the matching. |
1801 Value matchingValue() const { |
1800 Value matchingValue() const { |
1802 Value sum = 0; |
1801 Value sum = 0; |
1803 for (NodeIt n(_graph); n != INVALID; ++n) { |
1802 for (NodeIt n(_graph); n != INVALID; ++n) { |
1804 if ((*_matching)[n] != INVALID) { |
1803 if ((*_matching)[n] != INVALID) { |
1805 sum += _weight[(*_matching)[n]]; |
1804 sum += _weight[(*_matching)[n]]; |
1896 /// \see BlossomIt |
1895 /// \see BlossomIt |
1897 Value blossomValue(int k) const { |
1896 Value blossomValue(int k) const { |
1898 return _blossom_potential[k].value; |
1897 return _blossom_potential[k].value; |
1899 } |
1898 } |
1900 |
1899 |
1901 /// \brief Lemon iterator for get the items of the blossom. |
1900 /// \brief Iterator for obtaining the nodes of the blossom. |
1902 /// |
1901 /// |
1903 /// Lemon iterator for get the nodes of the blossom. This class |
1902 /// Iterator for obtaining the nodes of the blossom. This class |
1904 /// provides a common style lemon iterator which gives back a |
1903 /// provides a common lemon style iterator for listing a |
1905 /// subset of the nodes. |
1904 /// subset of the nodes. |
1906 class BlossomIt { |
1905 class BlossomIt { |
1907 public: |
1906 public: |
1908 |
1907 |
1909 /// \brief Constructor. |
1908 /// \brief Constructor. |
1910 /// |
1909 /// |
1911 /// Constructor for get the nodes of the variable. |
1910 /// Constructor to get the nodes of the variable. |
1912 BlossomIt(const MaxWeightedMatching& algorithm, int variable) |
1911 BlossomIt(const MaxWeightedMatching& algorithm, int variable) |
1913 : _algorithm(&algorithm) |
1912 : _algorithm(&algorithm) |
1914 { |
1913 { |
1915 _index = _algorithm->_blossom_potential[variable].begin; |
1914 _index = _algorithm->_blossom_potential[variable].begin; |
1916 _last = _algorithm->_blossom_potential[variable].end; |
1915 _last = _algorithm->_blossom_potential[variable].end; |
2815 ~MaxWeightedPerfectMatching() { |
2814 ~MaxWeightedPerfectMatching() { |
2816 destroyStructures(); |
2815 destroyStructures(); |
2817 } |
2816 } |
2818 |
2817 |
2819 /// \name Execution control |
2818 /// \name Execution control |
2820 /// The simplest way to execute the algorithm is to use the member |
2819 /// The simplest way to execute the algorithm is to use the |
2821 /// \c run() member function. |
2820 /// \c run() member function. |
2822 |
2821 |
2823 ///@{ |
2822 ///@{ |
2824 |
2823 |
2825 /// \brief Initialize the algorithm |
2824 /// \brief Initialize the algorithm |
3044 /// \see BlossomIt |
3043 /// \see BlossomIt |
3045 Value blossomValue(int k) const { |
3044 Value blossomValue(int k) const { |
3046 return _blossom_potential[k].value; |
3045 return _blossom_potential[k].value; |
3047 } |
3046 } |
3048 |
3047 |
3049 /// \brief Lemon iterator for get the items of the blossom. |
3048 /// \brief Iterator for obtaining the nodes of the blossom. |
3050 /// |
3049 /// |
3051 /// Lemon iterator for get the nodes of the blossom. This class |
3050 /// Iterator for obtaining the nodes of the blossom. This class |
3052 /// provides a common style lemon iterator which gives back a |
3051 /// provides a common lemon style iterator for listing a |
3053 /// subset of the nodes. |
3052 /// subset of the nodes. |
3054 class BlossomIt { |
3053 class BlossomIt { |
3055 public: |
3054 public: |
3056 |
3055 |
3057 /// \brief Constructor. |
3056 /// \brief Constructor. |
3058 /// |
3057 /// |
3059 /// Constructor for get the nodes of the variable. |
3058 /// Constructor to get the nodes of the variable. |
3060 BlossomIt(const MaxWeightedPerfectMatching& algorithm, int variable) |
3059 BlossomIt(const MaxWeightedPerfectMatching& algorithm, int variable) |
3061 : _algorithm(&algorithm) |
3060 : _algorithm(&algorithm) |
3062 { |
3061 { |
3063 _index = _algorithm->_blossom_potential[variable].begin; |
3062 _index = _algorithm->_blossom_potential[variable].begin; |
3064 _last = _algorithm->_blossom_potential[variable].end; |
3063 _last = _algorithm->_blossom_potential[variable].end; |