6#include <py2cpp/py2cpp.hpp>
64template <
typename Graph,
typename C1,
typename C2>
66 using T =
typename C2::value_type;
68 [[maybe_unused]]
auto total_dual_cost = T(0);
69 auto total_primal_cost = T(0);
71 for (
auto&& edge : gra.edges()) {
72 auto [utx, vtx] = edge.end_points();
73 if (cover[utx] || cover[vtx]) {
76 if (gap[utx] < gap[vtx]) {
80 total_dual_cost += gap[vtx];
81 total_primal_cost += weight[vtx];
86 assert(total_dual_cost <= total_primal_cost);
87 assert(total_primal_cost <= 2 * total_dual_cost);
88 return total_primal_cost;
140template <
typename Graph,
typename C1,
typename C2>
142 using T =
typename C2::value_type;
144 auto cover = [&](
const auto& utx) {
146 for (
auto&& vtx : gra[utx]) {
152 [[maybe_unused]]
auto total_dual_cost = T(0);
153 auto total_primal_cost = T(0);
154 for (
auto&& utx : gra) {
162 auto min_val = gap[utx];
164 for (
auto&& vtx : gra[utx]) {
168 if (min_val > gap[vtx]) {
174 indset[min_vtx] =
true;
175 total_primal_cost += weight[min_vtx];
176 total_dual_cost += min_val;
177 if (min_vtx == utx) {
180 for (
auto&& vtx : gra[utx]) {
184 return total_primal_cost;
auto min_vertex_cover_pd(const Graph &gra, C1 &cover, const C2 &weight)
Minimum weighted vertex cover using primal-dual algorithm.
Definition primal_dual.hpp:65
auto min_maximal_independant_set_pd(const Graph &gra, C1 &indset, C1 &dep, const C2 &weight)
Minimum maximal independent set using primal-dual algorithm.
Definition primal_dual.hpp:141