NetOptim 1.2.6
Loading...
Searching...
No Matches
primal_dual.hpp
Go to the documentation of this file.
1// -*- coding: utf-8 -*-
2#pragma once
3
4#include <algorithm>
5// #include <numeric>
6#include <py2cpp/py2cpp.hpp>
7
64template <typename Graph, typename C1, typename C2>
65auto min_vertex_cover_pd(const Graph& gra, C1& cover, const C2& weight) {
66 using T = typename C2::value_type;
67
68 [[maybe_unused]] auto total_dual_cost = T(0);
69 auto total_primal_cost = T(0);
70 auto gap = weight;
71 for (auto&& edge : gra.edges()) {
72 auto [utx, vtx] = edge.end_points();
73 if (cover[utx] || cover[vtx]) {
74 continue;
75 }
76 if (gap[utx] < gap[vtx]) {
77 std::swap(utx, vtx);
78 }
79 cover[vtx] = true;
80 total_dual_cost += gap[vtx];
81 total_primal_cost += weight[vtx];
82 gap[utx] -= gap[vtx];
83 gap[vtx] = T(0);
84 }
85
86 assert(total_dual_cost <= total_primal_cost);
87 assert(total_primal_cost <= 2 * total_dual_cost);
88 return total_primal_cost;
89}
90
140template <typename Graph, typename C1, typename C2>
141auto min_maximal_independant_set_pd(const Graph& gra, C1& indset, C1& dep, const C2& weight) {
142 using T = typename C2::value_type;
143
144 auto cover = [&](const auto& utx) {
145 dep[utx] = true;
146 for (auto&& vtx : gra[utx]) {
147 dep[vtx] = true;
148 }
149 };
150
151 auto gap = weight;
152 [[maybe_unused]] auto total_dual_cost = T(0);
153 auto total_primal_cost = T(0);
154 for (auto&& utx : gra) {
155 if (dep[utx]) {
156 continue;
157 }
158 if (indset[utx]) { // pre-define independant
159 cover(utx);
160 continue;
161 }
162 auto min_val = gap[utx];
163 auto min_vtx = utx;
164 for (auto&& vtx : gra[utx]) {
165 if (dep[vtx]) {
166 continue;
167 }
168 if (min_val > gap[vtx]) {
169 min_val = gap[vtx];
170 min_vtx = vtx;
171 }
172 }
173 cover(min_vtx);
174 indset[min_vtx] = true;
175 total_primal_cost += weight[min_vtx];
176 total_dual_cost += min_val;
177 if (min_vtx == utx) {
178 continue;
179 }
180 for (auto&& vtx : gra[utx]) {
181 gap[vtx] -= min_val;
182 }
183 }
184 return total_primal_cost;
185}
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