61 const ArcIndex num_arcs = arc_capacity_.size();
62 arc_flow_.assign(num_arcs, 0);
63 underlying_max_flow_.reset();
64 underlying_graph_.reset();
66 if (source == sink || source < 0 || sink < 0) {
69 if (source >= num_nodes_ || sink >= num_nodes_) {
72 underlying_graph_ = std::make_unique<Graph>(num_nodes_, num_arcs);
73 underlying_graph_->AddNode(source);
74 underlying_graph_->AddNode(sink);
75 for (
int arc = 0; arc < num_arcs; ++arc) {
76 underlying_graph_->AddArc(arc_tail_[arc], arc_head_[arc]);
78 underlying_graph_->Build(&arc_permutation_);
79 underlying_max_flow_ = std::make_unique<GenericMaxFlow<Graph>>(
80 underlying_graph_.get(), source, sink);
81 for (
ArcIndex arc = 0; arc < num_arcs; ++arc) {
83 arc < arc_permutation_.size() ? arc_permutation_[arc] : arc;
84 underlying_max_flow_->SetArcCapacity(permuted_arc, arc_capacity_[arc]);
86 if (underlying_max_flow_->Solve()) {
87 optimal_flow_ = underlying_max_flow_->GetOptimalFlow();
88 for (
ArcIndex arc = 0; arc < num_arcs; ++arc) {
90 arc < arc_permutation_.size() ? arc_permutation_[arc] : arc;
91 arc_flow_[arc] = underlying_max_flow_->Flow(permuted_arc);
96 switch (underlying_max_flow_->status()) {
131 FlowModelProto model;
132 model.set_problem_type(FlowModelProto::MAX_FLOW);
133 for (
int n = 0; n < num_nodes_; ++n) {
134 FlowNodeProto* node = model.add_nodes();
136 if (n == source) node->set_supply(1);
137 if (n == sink) node->set_supply(-1);
139 for (
int a = 0; a < arc_tail_.size(); ++a) {
140 FlowArcProto* arc = model.add_arcs();
141 arc->set_tail(
Tail(a));
142 arc->set_head(
Head(a));