Minimum-cost flow problemを扱うライブラリです。
var graph = init_mcf_graph[Cap, Cost](int n)
$n$ 頂点 $0$ 辺のグラフを作る。Capは容量の型、Costはコストの型
制約
Cap, Cost は int, ll計算量
graph.add_edge(src:int, dst:int, cap:Cap, cost:Cost):int
fromからtoへ最大容量cap, コストcostの辺を追加する。何番目に追加された辺かを返す。
制約
計算量
(1) graph.flow(s:int, t:int):(Cap, Cost)
(2) graph.flow(s:int, t:int, flow_limit:Cap):(Cap, Cost)
$s$ から $t$ へ流せるだけ流し、その流量とコストを返す。
flow_limitまで流せるだけ流す制約
min_cost_slopeと同じ計算量
min_cost_slopeと同じgraph.slope(s:int, t:int):seq[(Cap, Cost)]
graph.slope(s:int, t:int, flow_limit:Cap):seq[(Cap, Cost)]
帰り値に流量とコストの関係の折れ線が入る。全ての $x$ について、流量 $x$ の時の最小コストを $g(x)$ とすると、$(x, g(x))$ は帰り値を折れ線として見たものに含まれる。
.first、.secondは共に狭義単調増加制約
辺のコストの最大を $x$ として
min_cost_slopeやmin_cost_max_flowを合わせて複数回呼んだときの挙動は未定義sからtへ流したフローの流量が Cap に収まる。Cost に収まる。int): $0 \leq nx \leq 2 \times 10^9 + 1000$ll): $0 \leq nx \leq 8 \times 10^{18} + 1000$計算量
$F$を流量、$m$を追加した辺の本数として
type edge_info[Cap, Cost] =
src, dst:int
cap, flow: Cap
cost:Cost
(1) graph.get_edge(int i):edge_info[Cap, Cost]
(2) graph.edges():seq[edge_info[Cap, Cost]]
$m$ を追加された辺数として
制約
計算量