web-dev-qa-db-ja.com

最大フローアルゴリズムを使用してグラフの最小カットを見つけるにはどうすればよいですか?

グラフで最小カットを見つける必要があります。フローネットワークについて読んでいますが、見つけることができるのは、Ford-Fulkerson、Push-relabelなどの最大フローアルゴリズムだけです。最大フローアルゴリズムを使用したグラフの最小カットどうやって?

私がこれまでに見つけた最高の情報は、「飽和」エッジ、つまりフローが容量に等しいエッジを見つけた場合、それらのエッジは最小カットに対応するということです。本当?私には100%正しいとは思えません。最小カットのすべてのエッジが飽和するのは事実ですが、最小カットの「パス」から外れた飽和エッジもあると思います。

54
cesarbs

ソース頂点から、残差ネットワークのエッジ(つまり、フローのあるエッジの非飽和エッジとバックエッジ)に沿って深さ優先検索を実行し、この方法で到達できるすべての頂点をマークします。カットは、マークされた頂点からマークされていない頂点に向かうすべてのエッジで構成されます。明らかに、これらのエッジは飽和しているため、通過しませんでした。あなたが述べたように、最小カットの一部ではない他の飽和エッジがあるかもしれません。

45
Falk Hüffner

私はうるさくなりたくありませんが、提案された解決策は提案されたとおりに正しくありません。

正しい解決策:実際にすべきことは、Residual-Network Gfウィキペディアで読んでください )そして頂点をマークします。そして、マークされた頂点から頂点とマークされていない頂点を持つものを選択できます。

「不飽和エッジをたどる」だけでは十分ではない理由:フローアルゴリズムが図のようにエッジを飽和させることを考慮してください。 「不飽和エッジをたどる」というアプローチで、訪問している頂点を緑色でマークしました。明らかに、唯一の正しい最小カットはE-Fからのエッジですが、提案された解決策もA-D(および場合によってはD-E)を返します。

enter image description here 代わりに残余ネットワークを考慮すると、dfs/bfsが頂点Dにアクセスすることに注意してください。これは、EからDへのエッジがあるため、エッジEFがfrom-vertexのマークが付いた唯一のエッジになるためですマークされていない頂点へ。

26
dingalapadum

注:Falkのアルゴリズムを使用して、最小頂点と最大頂点の両方の最小カットを見つけることができます。後者の場合、アルゴリズムを逆にする必要があります。ソースの代わりにシンク頂点から検索します。関連する質問を参照してください: ネットワークフロー:新しいエッジの追加

1
Gyula

理解する1つの方法は、カットを2つのセットSとTとして定義し、それぞれsとtを含めることです。

次に、残差ネットワークのsから到達可能なSのすべての頂点を追加し、残りのエッジをTに配置します。これは1つのカットになります。

次に、tから到達可能なすべての頂点をTに残余ネットワークに配置し、残りの頂点をSに配置することにより、カットを形成できます。

このビデオを見て、sとtから到達可能な頂点をどのように見つけるかを調べてください。

https://www.youtube.com/watch?v=FIJaXfUIXJA&index=4&list=PLe-ggMe31CTduQ68XQ-sVj32wYJIspTma

1
Sahil Jain

したがって、最小カットを取得する方法を正確に示すには:

  1. Ford-Fulkersonアルゴリズムを実行して最大フローを見つけ、残差グラフを取得します1
  2. 残差グラフでBFSを実行して、残差グラフのソースから到達可能な頂点のセットを見つけます(残差グラフで容量が0のエッジを使用できないことを考慮して) )重要:到達可能な頂点の正しいセットを見つけるには、残差グラフで逆エッジを使用する必要があります!!! (このアルゴリズムを参照)
  3. 元のグラフのすべてのエッジは、到達可能な頂点から到達不能な頂点までであり、最小カットエッジです。そのようなエッジをすべて印刷します。

1 エッジの容量が、元の容量からそのフロー(最大フローネットワークからのフロー)を引いたもののように定義されているグラフ。

1
MichalH

私はこれが他の人が言っていることだと思いますが、私はそれが不明瞭であることがわかったので、ここに私の説明があります:

ソースノードから、グラフを塗りつぶし、残余容量のあるエッジに沿ってのみ移動し、訪問した各頂点をマークします。これにはDFSを使用できます。頂点からのバックエッジには、前方エッジに沿ったフローに等しい残余容量があることを思い出してください(つまり、r(u、v)=エッジの残余容量(u、v)、r(v、u)= flow(u 、v))。

実際には、これはグラフのS-TカットのS部分を決定します。

最小カットは、1つの頂点が上の塗りつぶしからマークされ、他の頂点がマークされないように、エッジのセットになります。これらは、残余容量のないエッジになり(そうでない場合は、DFSでトラバースしたことになります)、一緒に最小カットを形成します。

これらのエッジを削除すると、マークされていない頂点のセットがカットのTセクションを形成します。

0
mindvirus

最大フローが計算された後、残差グラフにvからuおよびf(v,u) = c(u,v) [残差グラフにエッジがあるように、エッジ(u,v)を検索できます。エッジが飽和しています]

そのようなエッジをショートリストに登録した後、残差グラフにuからシンクtへのパスが存在しないという基準を使用して、そのようなエッジ(u,v)を選択できます。この条件が満たされる場合、そのようなエッジは(S,T) cutの一部を形成します

このアルゴリズムの実行時間はO(E) * O( V + E ) = O( E^2 )です

0
SPV