プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

フォードファルカーソンアルゴリズム


Ford-Fulkersonアルゴリズムは、特定のグラフの開始頂点からシンク頂点への最大フローを検出するために使用されます。このグラフでは、すべてのエッジに容量があります。 SourceとSinkという名前の2つの頂点が提供されます。ソース頂点にはすべて外向きのエッジがあり、内向きのエッジはありません。シンクにはすべて内向きのエッジがあり、外向きのエッジはありません。

フォードファルカーソンアルゴリズム

いくつかの制約があります:

  • エッジのフローは、そのグラフの所定の容量を超えません。
  • 流入フローと流出フローも、ソースとシンクを除くすべてのエッジで等しくなります。

入力と出力

入力:隣接行列:0 10 0 10 0 00 0 4 2 8 00 0 0 0 0100 0 0 0 9 00 0 6 0 0100 0 0 0 0 0出力:最大フローは:19 

アルゴリズム

bfs (vert、start、sink)

入力: 頂点リスト、開始ノード、およびシンクノード。

出力- シンクにアクセスすると真になります。

最初にすべてのノードを未訪問の開始状態としてマークします。開始ノードの訪問済みの先行ノードはφです。キューが空でないときに開始をキューquに挿入し、キューから要素を削除して、すべての頂点iの頂点uに設定します。残差グラフ、uとiが接続されていて、iが訪問されていない場合は、頂点iをキューに追加します。iの前のキューに頂点iを追加します。 

fordFulkerson(vert、source、sink)

入力: 頂点リスト、ソース頂点、およびシンク頂点。

出力- 開始からシンクまでの最大フロー。

残差グラフの作成を開始し、bfs(vert、source、sink)がtrueのときに指定されたグラフをコピーし、pathFlow:=∞v:=頂点をシンクし、v≠頂点を開始し、u:=vpathFlowの先行を実行します:=pathFlowとresidualGraph[u、v]の最小値v:=vの先行が完了v:=頂点をシンクし、v≠頂点を開始、do u:=vの先行] – pathFlow ResidualGraph [v、u]:=ResidualGraph [v、u] – pathFlow v:=v done maFlowの前身:=maxFlow + pathFlow done return maxFlowEnd 

 #include  #include  #define NODE 6using namespace std; typedef struct node {int val; int状態; // status int pred; // predecessor} node; int minimum(int a、int b){return(a  que; for(i =0; i  0 &&vert [i] .state ==0){que.push(vert [i]); vert [i] .pred =u.val; vert [i] .state =1; }}} return(vert [sink.val] .state ==1);} int fordFulkerson(node * vert、node source、node sink){int maxFlow =0; int u、v; for(int i =0; i  

出力

最大フローは次のとおりです:19 

  1. フロイドウォーシャルアルゴリズム

    Floyd-Warshallアルゴリズムを使用して、特定の重み付きグラフからすべてのペアの最短経路問題を見つけます。このアルゴリズムの結果として、グラフ内の任意のノードから他のすべてのノードまでの最小距離を表す行列が生成されます。 最初、出力行列はグラフの指定されたコスト行列と同じです。その後、出力行列はすべての頂点kを中間頂点として更新されます。 このアルゴリズムの時間計算量はO(V ^ 3)です。ここで、Vはグラフ内の頂点の数です。 入力と出力 Input: The cost matrix of the graph. 0 3 6 ∞ ∞ ∞ &

  2. C ++のベルマンフォードアルゴリズム?

    ベルマンフォードアルゴリズムは、開始頂点として扱われる頂点から計算された頂点の最短経路を見つけるために使用される動的計画法アルゴリズムです。このアルゴリズムは反復法に従い、最短パスを継続的に見つけようとします。重み付きグラフのベルマンフォードアルゴリズム。 このアルゴリズムは、1955年にAlphonsoshimbelによって提案されました。アルゴリズムにはRichardBellmanとLesterFordによる改訂があります。 1956年と1958年に、このアルゴリズムのためにベルマンフォードアルゴリズムと名付けられました。 。このアルゴリズムは、1957年にEward F. Mooreに