computing network flows
、 アルゴリズム設計マニュアル の意味:
従来のネットワークフローアルゴリズムは、パスの拡張、およびsからtへの正容量のパスを繰り返し見つけてフローに追加するという考え方に基づいています。ネットワークを通るフローは、拡張パスが含まれていない場合にのみ最適であることが示されます。
augmenting paths
。私はグーグルで検索しました:
しかし、それらはすべて上記の引用を参照しています。
augmenting path
?
拡張パスは、ソースからシンクへの正の容量を持つエッジのみを使用してグラフを通る単純なパス(サイクルを含まないパス)です。
したがって、上記のステートメントは何らかの形で明白です-正の容量エッジのみを使用するソースからシンクへのパスが見つからない場合、フローを増やすことはできません。
ところで、その声明の証明はそれほど簡単ではありません。
拡張とは、大きくすることを意味します。所定のフローネットワークG=(V,E)
およびフローf
では、拡張パスp
は、残余ネットワークsource s
からsink t
への単純なパスですGf
。 residual network
の定義により、制約に違反することなく、(u,v)
のいずれかで、容量Cf(u,v)
まで、拡張パスのエッジ(u,v)
のフローを増やすことができます。 (v,u)
は元のフローネットワークG
にあります。また、拡張パスpの各エッジでフローを増やすことができる最大量は、residual capacity of p
と呼ばれます。その証拠は、thomas hによるアルゴリズムの紹介にあります。コルメンなど.
そして、ソースからシンクへの増強パスをどのようにして見つけますか? BFSの修正バージョンを使用します。シンクに達するまでソースからBFSを実行し、残余容量がある場合にのみEdgeを移動します(つまり、そのEdgeの最大容量-電流フロー> 0)。そして、ソースからシンクへのこのパスでは、最小の残余容量を維持します。これは、そのパスを通過できる最大フローです。アイデアを得るための高レベルのコードスニペット:
bool maxFlowAchieved = false;
int maxFlow = 0; // keeps track of what is the max flow in the network
while(!maxFlowAchieved)
{
//BFS returns collection of Edges in the traversal order from source to sink
std::vector<Edge*> path = BFS(source, sink);
maxFlowAchieved = path.size() == 0; // all paths exhausted
if(maxFlowAchieved)
break;
// traverse each Edge in the path and find minimum residual capacity
// Edge->residual = Edge->maxCapacity - Edge->currentflow
int allowedFlow = GetMinResidualOnPath(path);
// Now add additional flow to each Edge in the path.
// i.e. for each Edge in path, Edge->currentflow += allowedFlow
// clearly, Edge->currentflow + allowedFlow <= Edge->maxCapacity
SaturatePath(path, allowedFlow);
maxFlow += allowedFlow;
}
return maxFlow;