最小費用B-flow

下限・上限付き有向辺、各頂点の供給量・需要量、および辺費用を持つ 最小費用B-flow問題を解きます。

一般形

var flow =
  initBFlow[Capacity, Cost](
    vertexCount,
  )

flow.add_supply(
  vertex,
  supply,
)

flow.add_demand(
  vertex,
  demand,
)

flow.add_edge(
  source,
  target,
  lowerCapacity,
  upperCapacity,
  cost,
)

let (feasible, minimumCost) =
  flow.solve()

引数・型

辺は追加順に番号付けされます。平行辺を追加できます。負の辺費用にも対応します。

前提条件

lower > upperの辺を追加するとflow.infeasibleがtrueになります。

一般の実行可能性判定にはflow.infeasibleではなく、必ずsolve()の 返り値の第1要素を使用してください。容量不足や供給・需要総量の不一致では、 solve()[0]がfalseでもflow.infeasibleはfalseのままです。

返り値と副作用

let (feasible, minimumCost) =
  flow.solve()

solve()[0]が一般の実行可能性を表す正本です。

具体例

import atcoder/extra/graph/bflow

var flow =
  initBFlow[int, int](2)

flow.add_supply(
  0,
  2,
)

flow.add_demand(
  1,
  2,
)

flow.add_edge(
  0,
  1,
  2,
  5,
  3,
)

let answer =
  flow.solve()

doAssert answer ==
  (true, 6)

doAssert flow.f ==
  @[2]

関連API

このmoduleは下限・上限、頂点balance、費用を1つのB-flow問題として扱います。 内部では最大流と費用スケーリング型最小費用流を組み合わせます。

計算量と内部実装

solveの詳細な上界は、内部で利用するMFGraphとMCFCostScalingに依存します。