ネットワーク フローがあり、Edmond-Karp アルゴリズムを使用すると、ネットワーク上にすでに最大フローがあるとします。では、任意のエッジ (一定の容量を持つ) をネットワークに追加した場合、最大フローを更新する最良の方法は何ですか? 新しいエッジに関する残差ネットワークを更新し、新しい最大フローが見つかるまで再び拡張パスを探すことを考えていましたが、それが機能するかどうか、またはそれが最善の方法であるかどうかはわかりません!
2506 次
2 に答える
4
maxflow を実行すると、各エッジが流れたコンテンツの量がわかります。
したがって、エッジのコストが変更された場合、次のことができます。
- そのエッジによって流れたコンテンツが であるとします
w
。 - 次に、そのエッジからa
forward dfs
と aを実行し、リンクされたエッジからコンテンツbackward dfs
全体を元に戻します。w
ここで、各エッジは で表されますx/y
。ここy
で、エッジ容量をx
意味し、それが流れたコンテンツを意味します。
次に、エッジのコストを から に変更4->3
し2
ます3
。
あなたがしなければならないことは、フローされたコンテンツとしてこれらのエッジforward and backward dfs
から4->3
エッジから重みを取り消すことだけです。2
4->3
w=2
プロセスは次のようになります。
これでほぼ完了です:)
- エッジのコストを
4->3
からに変更2
し3
、再び拡張パスを見つけようとします :)
わかりにくい場合や、間違っている場合はお知らせください:)
編集 :
新しいエッジ コストが現在のコストよりも大きい場合、重みを元に戻す必要はありません。エッジの容量を変更する拡張パスを見つけようとするだけです。
ただし、容量が減少した場合は、重量を元に戻して、増加するパスを見つけようとする必要があります.
新しいエッジが追加された場合は、エッジを追加するだけで、利用可能な場合は拡張パスを見つけることができます。それでおしまい。
于 2014-12-13T09:37:32.773 に答える