Minimum-cost flow problemを扱うライブラリです。
mcf_graph<Cap, Cost> graph(int n);Capは容量の型、Costはコストの型
@{keyword.constraints}
$0 \leq n \leq 10^8$ -
Cap, Costはint, ll
@{keyword.complexity}
$O(n)$
int graph.add_edge(int from, int to, Cap cap, Cost cost);fromからtoへ最大容量cap, コストcostの辺を追加する。何番目に追加された辺かを返す。
@{keyword.constraints}
$0 \leq \mathrm{from}, \mathrm{to} \lt n$ $0 \leq \mathrm{cap}, \mathrm{cost}$
@{keyword.complexity}
- ならし
$O(1)$
(1) pair<Cap, Cost> graph.flow(int s, int t);
(2) pair<Cap, Cost> graph.flow(int s, int t, Cap flow_limit);- (1)
$s$ から$t$ へ流せるだけ流す - (2)
$s$ から$t$ へ流量flow_limitまで流せるだけ流す
@{keyword.constraints}
min_cost_slopeと同じ
@{keyword.complexity}
min_cost_slopeと同じ
vector<pair<Cap, Cost>> graph.slope(int s, int t);
vector<pair<Cap, Cost>> graph.slope(int s, int t, Cap flow_limit);返り値に流量とコストの関係の折れ線が入る。全ての
- 返り値の最初の要素は
$(0, 0)$ - 返り値の
.firstは狭義単調増加、.secondは広義単調増加 - 3点が同一線上にあることはない
- (1) 返り値の最後の要素は最大流量
$x$ として$(x, g(x))$ - (2) 返り値の最後の要素は
$y = \min(x, \mathrm{flow\_limit})$ として$(y, g(y))$
@{keyword.constraints}
辺のコストの最大を
$s \neq t$ $0 \leq s, t \lt n$ -
min_cost_slopeやmin_cost_max_flowを合わせて複数回呼んだときの挙動は未定義 -
sからtへ流したフローの流量がCapに収まる。 - 流したフローのコストの総和が
Costに収まる。 - (Cost :
int):$0 \leq nx \leq 2 \times 10^9 + 1000$ - (Cost :
ll):$0 \leq nx \leq 8 \times 10^{18} + 1000$
@{keyword.complexity}
$O(F (n + m) \log (n + m))$
struct edge<Cap, Cost> {
int from, to;
Cap cap, flow;
Cost cost;
};
(1) mcf_graph<Cap, Cost>::edge graph.get_edge(int i);
(2) vector<mcf_graph<Cap, Cost>::edge> graph.edges();- 今の内部の辺の状態を返す
- 辺の順番はadd_edgeで追加された順番と同一
@{keyword.constraints}
- (1):
$0 \leq i \lt m$
@{keyword.complexity}
- (1):
$O(1)$ - (2):
$O(m)$
@{example.mincostflow_practice}