C コードまたは期待値として定義されるマクロがあり、ユーザーが必要とするたびに再利用されます。フロイド・ウォルシャル アルゴリズムは、指定された重み付きグラフ内の頂点のすべてのペア間の最短経路を見つけるプロセスです。このアルゴリズムは動的プログラミング アプローチに従って、最小重みグラフを見つけます。
フロイト・ワルシャルアルゴリズムの意味を図で理解しましょう -
頂点 1 をソース、頂点 4 を目的地として、それらの間の最短パスを見つけます。
ターゲット頂点 4 に接続できるパスが 2 つあることがわかりました。
1 -> 4 – エッジの重みは 5
1 -> 8 -> 3 -> 4 – エッジの重み (1 2 1) は 4 です。
与えられたグラフ I では、2 つの頂点を接続する最小のエッジが表示されます。ここで、頂点 8 と頂点 3 の間のパスは、頂点 1 と頂点 4 を接続し、エッジは 4## になります。 #。一方、頂点 1 と頂点 4 の間には有向辺があり、辺の重みは 5 です。
次に、2 つの重み、つまり4 と 5 を比較します。したがって、ここでの 4 は、Floyd Warshall アルゴリズムに従って計算されたグラフの最小重みです。
この記事では、Floyd Warshall アルゴリズムを使用して、任意の 2 つのノード間の最短パスを見つけます。###文法###
プログラムでは次の構文が使用されます -
array_name
- 配列に付けられた名前。###アルゴリズム###
ヘッダー ファイル次に、'printPath'
という名前のグローバル関数定義を作成し、3 つのパラメーター、つまりを受け入れます。 j' パスが存在することを確認します。 次に、main 関数を開始し、頂点の数を表す値 ‘4’
を変数'dist[V][V]' に保存します。ご存知のとおり、dist[i][j] は 2D 行列を表し、'i' から 'j' までのエッジの重みを定義します。隣接行列を保存します。 次に、変数 'parent'
の 2D 配列を初期化しています。サイズはこの変数では、頂点の各ペア 'i' と
'j''parent[i][j]' を表示するために使用します。 ネストされた 2 つの for ループを使用して、最短パスを見つけます。最初の for ループは、行列内の行を反復処理します。次に、2 番目の for ループを通じて行列内の列を反復処理し、if-else ステートメント -
を使用して次の条件を確認します。If (dist[i][j] != INF && i != j) { parent[i][j] = i;}
の中国語訳は次のとおりです:parent[i][j] = i;}演算子を使用して 2 つの条件を表現します。両方の条件が満たされた場合、'i' は 'parent[i ][j] に格納されます。 ]' を実行し、パスが存在することを確認します。
#########他の{ parent[i][j] = -1;} の中国語訳は次のとおりです:parent[i][j] = -1;}else ステートメントでは、パスが存在しないことを確認するために、「-1」を "parent[i][j]"
に初期化します。次に、3 つのネストされた
for ループから開始し、0 ~ V-1 の範囲にある k 個の頂点を適用します。この範囲を利用して、最短距離とパスが更新されます。 3 番目のネストされたループでは、
次に、次の条件を与えて、すべての頂点ペアの最短距離とパスを出力します。
ネストされた 2 つの for ループを使用して、最短距離とパスを出力します。
という名前の関数を呼び出します。
#include <iostream> using namespace std; #define INF 1000000000 // Infinity void printPath(int parent[], int i, int j) { if (i == j) cout << i << " "; else if (parent[j] == -1) cout << "No path exists"; else { printPath(parent, i, parent[j]); cout << j << " "; } } int main() { int V = 4; // V represent number of vertices int dist[V][V] = {{0, 2, INF, 4}, {6, 0, 5, 3}, {INF, 10, 0, 1}, {7, 9, 8, 0}}; // Represent the graph using adjacency matrix // Apply the Floyd Warshall algorithm to find the shortest paths int parent[V][V]; for (int i = 0; i < V; i++) { for (int j = 0; j < V; j++) { if (dist[i][j] != INF && i != j) parent[i][j] = i; else parent[i][j] = -1; } } // update the path and distance using the k vertex range from 0 to V-1. for (int k = 0; k < V; k++) { for (int i = 0; i < V; i++) { for (int j = 0; j < V; j++) { if (dist[i][j] > dist[i][k] + dist[k][j]) { dist[i][j] = dist[i][k] + dist[k][j]; parent[i][j] = parent[k][j]; } } } } // Print shortest distances and paths between all pairs of vertices for (int i = 0; i < V; i++) { for (int j = 0; j < V; j++) { cout << "The Shortest distance between " << i << " and " << j << " is "; if (dist[i][j] == INF) cout << "INF "; else cout << dist[i][j] << " "; cout << "and the shortest path is:- "; printPath(parent[i], i, j); cout << endl; } } return 0; }
The Shortest distance between 0 and 0 is 0 and the shortest path is:- 0 The Shortest distance between 0 and 1 is 2 and the shortest path is:- 0 1 The Shortest distance between 0 and 2 is 7 and the shortest path is:- 0 1 2 The Shortest distance between 0 and 3 is 4 and the shortest path is:- 0 3 The Shortest distance between 1 and 0 is 6 and the shortest path is:- 1 0 The Shortest distance between 1 and 1 is 0 and the shortest path is:- 1 The Shortest distance between 1 and 2 is 5 and the shortest path is:- 1 2 The Shortest distance between 1 and 3 is 3 and the shortest path is:- 1 3 The Shortest distance between 2 and 0 is 8 and the shortest path is:- 2 3 0 The Shortest distance between 2 and 1 is 10 and the shortest path is:- 2 1 The Shortest distance between 2 and 2 is 0 and the shortest path is:- 2 The Shortest distance between 2 and 3 is 1 and the shortest path is:- 2 3 The Shortest distance between 3 and 0 is 7 and the shortest path is:- 3 0 The Shortest distance between 3 and 1 is 9 and the shortest path is:- 3 1 The Shortest distance between 3 and 2 is 8 and the shortest path is:- 3 2 The Shortest distance between 3 and 3 is 0 and the shortest path is:- 3
我们学习了使用Floyd Warshall算法找到任意两个节点之间的最短路径的概念。我们使用邻接矩阵作为程序的输入,通过它我们找到了最短路径和距离。此外,为了更新路径和距离,我们使用了k个顶点来更新行和列。在我们的日常生活中,我们在谷歌地图上搜索最短路线或路径,从一个起点到目的地。
以上がFloyd-Warshal アルゴリズムを使用して、任意の 2 つのノード間の最短パスを検索します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。