全ペア最短経路
すべてのペアの最短経路アルゴリズムは、Floyd-Warshallアルゴリズムとも呼ばれ、特定の重み付きグラフからすべてのペアの最短経路問題を見つけるために使用されます。このアルゴリズムの結果として、グラフ内の任意のノードから他のすべてのノードまでの最小距離を表す行列が生成されます。
最初、出力行列はグラフの指定されたコスト行列と同じです。その後、出力行列はすべての頂点kを中間頂点として更新されます。
このアルゴリズムの時間計算量はO(V3)です。ここで、Vはグラフ内の頂点の数です。
入力-グラフのコストマトリックス。
0 3 6 ∞ ∞ ∞ ∞ 3 0 2 1 ∞ ∞ ∞ 6 2 0 1 4 2 ∞ ∞ 1 1 0 2 ∞ 4 ∞ ∞ 4 2 0 2 1 ∞ ∞ 2 ∞ 2 0 1 ∞ ∞ ∞ 4 1 1 0
出力-すべてのペアの最短経路の行列。
0 3 4 5 6 7 7 3 0 2 1 3 4 4 4 2 0 1 3 2 3 5 1 1 0 2 3 3 6 3 3 2 0 2 1 7 4 2 3 2 0 1 7 4 3 3 1 1 0
アルゴリズム
floydWarshal(コスト)
入力 −与えられたグラフのコストマトリックス。
出力 −任意の頂点から任意の頂点への最短経路の行列。
Begin for k := 0 to n, do for i := 0 to n, do for j := 0 to n, do if cost[i,k] + cost[k,j] < cost[i,j], then cost[i,j] := cost[i,k] + cost[k,j] done done done display the current cost matrix End
例
#include<iostream> #include<iomanip> #define NODE 7 #define INF 999 using namespace std; //Cost matrix of the graph int costMat[NODE][NODE] = { {0, 3, 6, INF, INF, INF, INF}, {3, 0, 2, 1, INF, INF, INF}, {6, 2, 0, 1, 4, 2, INF}, {INF, 1, 1, 0, 2, INF, 4}, {INF, INF, 4, 2, 0, 2, 1}, {INF, INF, 2, INF, 2, 0, 1}, {INF, INF, INF, 4, 1, 1, 0} }; void floydWarshal(){ int cost[NODE][NODE]; //defind to store shortest distance from any node to any node for(int i = 0; i<NODE; i++) for(int j = 0; j<NODE; j++) cost[i][j] = costMat[i][j]; //copy costMatrix to new matrix for(int k = 0; k<NODE; k++){ for(int i = 0; i<NODE; i++) for(int j = 0; j<NODE; j++) if(cost[i][k]+cost[k][j] < cost[i][j]) cost[i][j] = cost[i][k]+cost[k][j]; } cout << "The matrix:" << endl; for(int i = 0; i<NODE; i++){ for(int j = 0; j<NODE; j++) cout << setw(3) << cost[i][j]; cout << endl; } } int main(){ floydWarshal(); }
出力
The matrix: 0 3 5 4 6 7 7 3 0 2 1 3 4 4 5 2 0 1 3 2 3 4 1 1 0 2 3 3 6 3 3 2 0 2 1 7 4 2 3 2 0 1 7 4 3 3 1 1 0
-
データ構造における円のk-最短経路アルゴリズム
単一の最短経路を与える代わりに、Yenのk-最短経路アルゴリズムは kを与えます 2番目に短いパスと3番目に短いパスを取得できるようにするための最短パス。 場所Aから場所Bに移動する必要があり、場所Aと場所Bの間に複数のルートが利用可能であるというシナリオを考えてみましょう。ただし、最短パスを見つけて、その観点からあまり考慮されていないすべてのパスを無視する必要があります。目的地に到達するための時間計算量。 例を挙げて理解しましょう- 与えられた例をBのピークを持つ橋と考えてください。誰かがAからCに橋を渡りたい場合、誰も橋を渡るためにピークに行くことはありません。したがって、Aか
-
C++の二分木における疑似パリンドロームパス
ノード値が1から9までの数字であるバイナリツリーがあるとします。パス内のノード値の少なくとも1つの順列が回文である場合、バイナリツリーの1つのパスは疑似回文であると言われます。ルートノードからリーフノードに向かう疑似パリンドロームパスの数を見つける必要があります。 したがって、入力が次のような場合 その場合、出力は2になります。これは、ルートノードからリーフノードに向かう3つのパスがあるためです。赤いパスは[2,3,3]に従い、緑のパスは[2,1,1]に従い、パス[ 2,3,1]。これらのパスのうち、赤のパス[2,3,3]は[3,2,3]として再配置でき、緑のパス[2,1,1]は再配