71auto max_parametric(
const Graph& gra, T& r_opt, Fn1&& distrance, Fn2&& zero_cancel, Mapping&& dist,
72 size_t max_iters = 1000) {
74 using Elem =
decltype(*std::declval<const Graph&>().begin());
75 using Nbrs = std::remove_cv_t<std::remove_reference_t<
decltype(_get_val(
76 std::declval<Elem>(), std::declval<const Graph&>()))>>;
77 using NbrElem =
decltype(*std::declval<const Nbrs&>().begin());
78 using Edge = std::remove_cv_t<std::remove_reference_t<
decltype(_get_val(
79 std::declval<NbrElem>(), std::declval<const Nbrs&>()))>>;
80 using Cycle = std::vector<Edge>;
82 auto get_weight = [&distrance, &r_opt](
const Edge& edge) -> T {
83 return static_cast<T
>(distrance(r_opt, edge));
86 auto ncf = NegCycleFinder<Graph>(gra);
91 for (
auto niter = 0U; niter != max_iters; ++niter) {
92 for (
auto&& ci : ncf.howard(dist, get_weight)) {
93 auto ri =
static_cast<T
>(zero_cancel(ci));
96 c_min = std::move(ci);
99 if (r_min >= r_opt)
break;
100 c_opt = std::move(c_min);
auto max_parametric(const Graph &gra, T &r_opt, Fn1 &&distrance, Fn2 &&zero_cancel, Mapping &&dist, size_t max_iters=1000)
Solve the maximum parametric problem.
Definition parametric.hpp:71