68# ifndef MIN_COST_MATCHING_H
69# define MIN_COST_MATCHING_H
73# include <type_traits>
88 template <
typename Cost_Type =
long long>
105 template <
typename Cost_Type =
long long>
114 namespace min_cost_matching_detail
124 template <
typename T>
127 static_assert(std::is_integral_v<T>,
128 "Min_Cost_Matching requires integral arc costs");
131 constexpr int T_digits = std::numeric_limits<T>::digits;
132 constexpr int LL_digits = std::numeric_limits<long long>::digits;
148 >
static_cast<__int128>(std::numeric_limits<long long>::max()))
149 <<
"Cost cannot be represented as long long";
155 <
static_cast<__int128>(std::numeric_limits<long long>::min()))
156 <<
"Cost cannot be represented as long long";
159 return static_cast<long long>(value);
166 template <
class Cost_Accessor>
183 <<
"Minimum-cost matching cannot negate LLONG_MIN cost";
226 <<
"compute_minimum_cost_general_matching(): g is a digraph";
229 using Raw_Cost = std::decay_t<decltype(cost(static_cast<Arc *>(
nullptr)))>;
231 static_assert(std::is_integral_v<Raw_Cost>,
232 "Min_Cost_Matching requires integral arc costs");
246 long long total_cost = 0;
247 for (
auto it =
matching.get_it(); it.has_curr(); it.next_ne())
249 Arc *arc = it.get_curr();
254 or sum <
static_cast<__int128>(std::numeric_limits<long long>::min()))
255 <<
"Minimum-cost matching total cost overflows long long";
256 total_cost =
static_cast<long long>(
sum);
260 <<
"Minimum-cost matching internal cardinality mismatch";
283 g,
matching, std::move(cost), std::move(sa),
326 <<
"compute_minimum_cost_perfect_general_matching(): g is a digraph";
338 g,
matching, std::move(cost), std::move(sa),
370 g,
matching, std::move(cost), std::move(sa));
Maximum-weight matching in general undirected graphs.
Exception handling system with formatted messages for Aleph-w.
#define ah_runtime_error_unless(C)
Throws std::runtime_error if condition does NOT hold.
#define ah_overflow_error_if(C)
Throws std::overflow_error if condition holds.
#define ah_domain_error_if(C)
Throws std::domain_error if condition holds.
List_Graph< Graph_Node< Node_Info >, Graph_Arc< Arc_Info > > GT
Functor wrapper for minimum-cost general matching.
Compute_Minimum_Cost_General_Matching(Cost cost=Cost(), SA sa=SA(), const bool max_cardinality=false)
Min_Cost_Matching_Result< long long > operator()(const GT &g, DynDlist< typename GT::Arc * > &matching)
Functor wrapper for minimum-cost perfect general matching.
Compute_Minimum_Cost_Perfect_General_Matching(Cost cost=Cost(), SA sa=SA())
Min_Cost_Perfect_Matching_Result< long long > operator()(const GT &g, DynDlist< typename GT::Arc * > &matching)
Default distance accessor for arc weights.
Dynamic doubly linked list with O(1) size and bidirectional access.
Graph_Arc< Arc_Info > Arc
The node class type.
Negated_Cost_Accessor(Cost_Accessor cost=Cost_Accessor())
long long operator()(Arc *arc) const
constexpr size_t get_num_nodes() const noexcept
Return the total of nodes of graph.
bool is_digraph() const noexcept
Return true if the graph this is directed.
Min_Cost_Perfect_Matching_Result< long long > compute_minimum_cost_perfect_general_matching(const GT &g, DynDlist< typename GT::Arc * > &matching, Cost cost=Cost(), SA sa=SA())
Compute minimum-cost perfect matching in a general undirected graph.
Min_Cost_Matching_Result< long long > compute_minimum_cost_general_matching(const GT &g, DynDlist< typename GT::Arc * > &matching, Cost cost=Cost(), SA sa=SA(), const bool max_cardinality=false)
Compute minimum-cost matching in a general undirected graph.
Blossom_Weighted_Result< long long > compute_maximum_weight_general_matching(const GT &g, DynDlist< typename GT::Arc * > &matching, Weight weight=Weight(), SA sa=SA(), const bool max_cardinality=false)
Compute maximum-weight matching in a general undirected graph.
Min_Cost_Matching_Result< long long > blossom_minimum_cost_matching(const GT &g, DynDlist< typename GT::Arc * > &matching, Cost cost=Cost(), SA sa=SA(), const bool max_cardinality=false)
Alias for compute_minimum_cost_general_matching().
Min_Cost_Perfect_Matching_Result< long long > blossom_minimum_cost_perfect_matching(const GT &g, DynDlist< typename GT::Arc * > &matching, Cost cost=Cost(), SA sa=SA())
Alias for compute_minimum_cost_perfect_general_matching().
long long to_ll_checked(T value)
Main namespace for Aleph-w library functions.
and
Check uniqueness with explicit hash + equality functors.
Divide_Conquer_DP_Result< Cost > divide_and_conquer_partition_dp(const size_t groups, const size_t n, Transition_Cost_Fn transition_cost, const Cost inf=dp_optimization_detail::default_inf< Cost >())
Optimize partition DP using divide-and-conquer optimization.
std::decay_t< typename HeadC::Item_Type > T
T sum(const Container &container, const T &init=T{})
Compute sum of all elements.
Default filter for filtered iterators on arcs.
Result of minimum-cost matching.
Cost_Type total_cost
Sum of matched arc costs.
size_t cardinality
Number of arcs in the matching.
Result of minimum-cost perfect matching.
Cost_Type total_cost
Total cost if feasible.
bool feasible
Whether a perfect matching exists.
size_t cardinality
Cardinality (|V|/2 if feasible).