224 {
225 assert(u_capacity.empty() || u_capacity.size() == u_nodes.size());
226 assert(v_capacity.empty() || v_capacity.size() == v_nodes.size());
229 total_nodes = u_nodes.size() + v_nodes.size() + v_group_capacity.size() + 2;
232
234
235 std::vector<int>v_node_to(v_nodes.size(),
sink_id);
236 for (size_t gid = 0; gid < v_group_capacity.size(); ++gid) {
237 for (auto vid : v_group_capacity[gid].first)
239 }
240
241
242 for (
int idx = 0; idx <
l_nodes.size(); ++idx) {
243 int capacity = u_capacity.empty() ? 1 : u_capacity[idx];
245 }
246
247 for (
int idx = 0; idx <
r_nodes.size(); ++idx) {
248 int capacity = v_capacity.empty() ? 1 : v_capacity[idx];
250 }
251
252
253 for (int idx = 0; idx < v_group_capacity.size(); ++idx) {
254 int capacity = v_group_capacity[idx].second;
256 }
257
258
259 for (
int i = 0; i <
l_nodes.size(); ++i) {
260 int from_idx = i;
261
262 if (auto iter = uv_link_limits.find(i); iter != uv_link_limits.end()) {
263 for (auto r_id : iter->second)
265 continue;
266 }
267
268 std::optional<std::vector<int>> unlink_limits;
269 if (auto iter = uv_unlink_limits.find(i); iter != uv_unlink_limits.end())
270 unlink_limits = iter->second;
271
272 for (
int j = 0; j <
r_nodes.size(); ++j) {
273
274 if (unlink_limits.has_value() && std::find(unlink_limits->begin(), unlink_limits->end(), j) != unlink_limits->end())
275 continue;
277 }
278 }
279 }
std::vector< int > l_nodes
Definition ToolOrderUtils.hpp:53
void add_edge(int from, int to, int capacity)
Definition ToolOrderUtils.cpp:281
int source_id
Definition ToolOrderUtils.hpp:50
std::vector< int > r_nodes
Definition ToolOrderUtils.hpp:54
int total_nodes
Definition ToolOrderUtils.hpp:49
int sink_id
Definition ToolOrderUtils.hpp:51
std::vector< std::vector< int > > adj
Definition ToolOrderUtils.hpp:55