フローネットワークは有向グラフであるG = (V, E)
ソース頂点とs ϵ V
シンク頂点t ϵ V
すべてのエッジ、および(u, v) ϵ E
(ノードを接続グラフ上u ϵ V
とはv ϵ V
)それに関連付けられた2つの量を有します。
c(u, v) >= 0
、エッジの容量a(u, v) >= 0
、1つのユニットをエッジから送信するコスト
0 <= f(u, v) <= c(u, v)
特定のエッジを通過するユニットの数になるように関数を定義します(u, v)
。したがって、特定のエッジのコスト(u, v)
はa(u, v) * f(u, v)
です。最小コスト流問題は、所与の流量のための全てのエッジ上の総コスト最小化するように定義されるd
以下の量で与えられるが、。
この問題には次の制約が適用されます。
- 容量要件:特定のエッジを通過する流れは、そのエッジの容量を超えることはできません(
f(u, v) <= c(u, v)
)。 - スキュー対称性:方向が逆の場合、特定のエッジを通る流れは非対称でなければなりません(
f(u, v) = -f(v, u)
)。 - フローの節約:シンク以外の非ソースノードへの正味フローは0である必要があります(それぞれについて
u ∉ {s, t}
、すべてを合計したw
、sum f(u, w) = 0
)。 - 必要なフロー:ソースからの正味のフローとシンクへの正味のフローは両方とも、ネットワークを介して必要なフローに等しい必要があります(すべてを合計した
u
、sum f(s, u) = sum f(u, t) = d
)。
フローネットワークG
と必要なフローを指定して、ネットワーク経由でユニットをd
送信するための最小コストを出力d
します。ソリューションが存在すると想定できます。d
すべての容量とコストは負でない整数になります。でN
ラベル付けされた頂点を持つネットワークの[0, N-1]
場合、ソース頂点は0
、シンク頂点はになりますN-1
。
これはcode-golfなので、最も短い回答(バイト単位)が優先されます。これは言語内および言語間の競争であることを忘れないでください。したがって、冗長な言語でソリューションを投稿することを恐れないでください。
ビルトインは許可されていますが、ビルトインのないソリューションを同じ回答の追加ソリューションとして、または独立した回答として含めることをお勧めします。
入力は、各エッジのキャパシティとコスト、および需要を含む、合理的な方法で行うことができます。
テストケース
テストケースは次の形式で提供されます。
c=<2D matrix of capacities> a=<2D matrix of costs> d=<demand> -> <solution>
c=[[0, 3, 2, 3, 2], [3, 0, 5, 3, 3], [2, 5, 0, 4, 5], [3, 3, 4, 0, 4], [2, 3, 5, 4, 0]] a=[[0, 1, 1, 2, 1], [1, 0, 1, 2, 3], [1, 1, 0, 2, 2], [2, 2, 2, 0, 3], [1, 3, 2, 3, 0]] d=7 -> 20
c=[[0, 1, 1, 5, 4], [1, 0, 2, 4, 2], [1, 2, 0, 1, 1], [5, 4, 1, 0, 3], [4, 2, 1, 3, 0]] a=[[0, 1, 1, 2, 2], [1, 0, 2, 4, 1], [1, 2, 0, 1, 1], [2, 4, 1, 0, 3], [2, 1, 1, 3, 0]] d=7 -> 17
c=[[0, 1, 4, 5, 4, 2, 3], [1, 0, 5, 4, 3, 3, 5], [4, 5, 0, 1, 5, 5, 5], [5, 4, 1, 0, 3, 2, 5], [4, 3, 5, 3, 0, 4, 4], [2, 3, 5, 2, 4, 0, 2], [3, 5, 5, 5, 4, 2, 0]] a=[[0, 1, 4, 2, 4, 1, 1], [1, 0, 3, 2, 2, 1, 1], [4, 3, 0, 1, 4, 5, 2], [2, 2, 1, 0, 2, 2, 3], [4, 2, 4, 2, 0, 4, 1], [1, 1, 5, 2, 4, 0, 2], [1, 1, 2, 3, 1, 2, 0]] d=10 -> 31
c=[[0, 16, 14, 10, 14, 11, 10, 4, 3, 16], [16, 0, 18, 19, 1, 6, 10, 19, 5, 4], [14, 18, 0, 2, 15, 9, 3, 14, 20, 13], [10, 19, 2, 0, 2, 10, 12, 17, 19, 22], [14, 1, 15, 2, 0, 11, 23, 25, 10, 19], [11, 6, 9, 10, 11, 0, 14, 16, 25, 4], [10, 10, 3, 12, 23, 14, 0, 11, 7, 8], [4, 19, 14, 17, 25, 16, 11, 0, 14, 5], [3, 5, 20, 19, 10, 25, 7, 14, 0, 22], [16, 4, 13, 22, 19, 4, 8, 5, 22, 0]] a=[[0, 12, 4, 2, 9, 1, 1, 3, 1, 6], [12, 0, 12, 16, 1, 2, 9, 13, 2, 3], [4, 12, 0, 2, 2, 2, 2, 10, 1, 1], [2, 16, 2, 0, 2, 1, 8, 4, 4, 2], [9, 1, 2, 2, 0, 5, 6, 23, 5, 8], [1, 2, 2, 1, 5, 0, 13, 12, 12, 1], [1, 9, 2, 8, 6, 13, 0, 9, 4, 4], [3, 13, 10, 4, 23, 12, 9, 0, 13, 1], [1, 2, 1, 4, 5, 12, 4, 13, 0, 13], [6, 3, 1, 2, 8, 1, 4, 1, 13, 0]] d=50 -> 213
これらのテストケースは、NetworkX Pythonライブラリを使用して計算されました。