NetworkXを、使って 最小カット問題 を解いてみます。
最小カット問題
グラフに対してsからtへのパスが存在しなくなるために除去しなければいけない辺の 容量の和の最小値 を求める問題を 最小カット問題 といいます。
前回記事で使ったグラフをもう一度作成します。
[Google Colaboratory]
1 | import networkx as nx |
[実行結果]
解法
最小カット問題 を解くためには、minimum_cut関数 を使います。
引数には、グラフオブジェクト、始点ノード、終了ノード を設定します。
[Google Colaboratory]
1 | cut_value, partition = nx.minimum_cut(G, 's', 't') |
[実行結果]
cut value: 11 (S, T): ({'1', '2', 's'}, {'3', 't'})
始点側のノードの集合は {‘1’, ‘2’, ‘s’} で、終点側の集合は {‘3’, ‘t’} となりました。
この集合2つをつなぐエッジ(辺)の容量の和は 11 であり、これが最小となります。
最小カット問題 の解は 最大流問題 と解は同じとなり、最大流最小カット定理 と呼ばれます。