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$ を追加された辺数として
制約
計算量