686 {
687 assert(u_capacity.empty() || u_capacity.size() == u_nodes.size());
688 assert(v_capacity.empty() || v_capacity.size() == v_nodes.size());
689 m_solver = std::make_unique<MinCostMaxFlow>();
693
694 m_solver->total_nodes = u_nodes.size() + v_nodes.size() + v_group_capacity.size() + 2;
695
698
700
701 std::vector<int> v_node_to(v_nodes.size(),
m_solver->sink_id);
702 for (size_t gid = 0; gid < v_group_capacity.size(); ++gid) {
703 for (auto vid : v_group_capacity[gid].first)
705 }
706
707
708 for (
int i = 0; i <
m_solver->l_nodes.size(); ++i) {
709 int capacity = u_capacity.empty() ? 1 : u_capacity[i];
711 }
712
713 for (
int i = 0; i <
m_solver->r_nodes.size(); ++i) {
714 int capacity = v_capacity.empty() ? 1 : v_capacity[i];
715 m_solver->add_edge(
m_solver->l_nodes.size() + i, v_node_to[i], capacity, 0);
716 }
717
718 for(int i=0;i<v_group_capacity.size();++i){
719 int capacity = v_group_capacity[i].second;
721 }
722
723 for (
int i = 0; i <
m_solver->l_nodes.size(); ++i) {
724 int from_idx = i;
725
726 if (auto iter = uv_link_limits.find(i); iter != uv_link_limits.end()) {
727 for (auto r_id : iter->second)
729 continue;
730 }
731
732
733 std::optional<std::vector<int>> unlink_limits;
734 if (auto iter = uv_unlink_limits.find(i); iter != uv_unlink_limits.end())
735 unlink_limits = iter->second;
736 for (
int j = 0; j <
m_solver->r_nodes.size(); ++j) {
737 if (unlink_limits.has_value() && std::find(unlink_limits->begin(), unlink_limits->end(), j) != unlink_limits->end())
738 continue;
740 }
741 }
742 }
std::unique_ptr< MinCostMaxFlow > m_solver
Definition ToolOrderUtils.hpp:169