フロイドアルゴリズムは、補間法とも呼ばれ、動的プログラミングのアイデアを使用して、特定の加重グラフ内の複数のソースポイント間の最短経路を見つけるアルゴリズムです。
このペーパーでは、FloydアルゴリズムのC ++実装について説明します。このアルゴリズムは、ポイントとエッジの動的入力をサポートし、インターフェースの説明を提供します
1データ構造
- 無向グラフの格納構造は、隣接行列を使用します。
- 各エッジの重みは、このエッジ上の2点間の距離です。
int ** d = NULL; //任意の2点の最短経路の重みの合計を格納する2次元配列
int ** path = NULL; // 2次元配列、任意の2点間の最短経路を格納
int matrixSize = 0; //図の頂点の数
int arcSize = 0; //図のエッジの数
int isDigraph = 0; //有向グラフか無向グラフかに関係なく、グラフのタイプ
2インターフェース定義
次のインターフェースを定義します。
/ *ストレージ構造を初期化します
vertexNum:頂点の数
arcNum:エッジの数* /
bool init(int vertexNum、int arcNum)
/ *エッジを追加
start:エッジの開始点
end:エッジの終わり
重量:エッジの重量* /
bool addArc(int start、int end、int weight、bool isDigraph = false)
/ *すべての頂点間の最短経路を計算* /
bool calculatePath()
/ * 2点間の最短経路に戻る
start:パスの開始点
end:パスの終わり* /
bool getShortestPath(int start、int end)
3ソースコードの実装
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define MAX 10000000
int ** d = NULL;
int **パス= NULL;
int matrixSize = 0;
int arcSize = 0;
int isDigraph = 0;
bool init(int vertexNum、int arcNum)
{
matrixSize = vertexNum;
arcSize = arcNum;
d =(int **)malloc(vertexNum * sizeof(int *));
memset(d、0、vertexNum * sizeof(int *));
for(int i = 0; i <vertexNum; i ++)
{
d [i] =(int *)malloc(vertexNum * sizeof(int));
memset(d [i]、0、vertexNum * sizeof(int));
for(int j = 0; j <vertexNum; j ++)
{
d [i] [j] = MAX;
}
}
パス=(int **)malloc(vertexNum * sizeof(int *));
memset(パス、0、vertexNum * sizeof(int *));
for(int i = 0; i <vertexNum; i ++)
{
path [i] =(int *)malloc(vertexNum * sizeof(int));
memset(パス[i]、0、vertexNum * sizeof(int));
for(int j = 0; j <vertexNum; j ++)
{
path [i] [j] = -1;
}
}
trueを返します。
}
bool addArc(int start、int end、int weight、bool isDigraph = false)
{
if(!isDigraph)
{
d [start] [end] = weight;
d [end] [start] =重量;
path [start] [end] = end;
path [end] [start] = start;
}
else
{
d [start] [end] = weight;
path [start] [end] = end;
}
}
bool calculatePath()
{
for(int k = 0; k <matrixSize; k ++)
for(int i = 0; i <matrixSize; i ++)
for(int j = 0; j <matrixSize; j ++){
if(d [i ] [k] + d [k] [j] <d [i] [j]){
d [i] [j] = d [i] [k] + d [k] [j];
パス[i] [j] =パス[i] [k];
}
}
trueを返します。
}
bool getShortestPath(int start、int end)
{
if((start!= end)&&(d [start] [end] <MAX))
{
printf( "%d->%d:%d、"、start、end 、d [開始] [終了]);
printf( "パス:");
int f = start;
int en = end;
while(f!= en)
{
printf( "%d->"、f);
f = path [f] [en];
}
printf( "%d \ n"、en);
trueを返します。
}
else if((start!= end)&&(d [start] [end]> = MAX))
{
printf( "%d->%d:NO PATH \ n"、start、end);
falseを返します。
}
falseを返します。
}
int main()
{
int i、j、m、n;
int x、y、z;
printf( "input vertexNum arcNum isDigraph:\ n");
scanf( "%d%d%d"、&n、&m、&isDigraph);
init(n、m);
for(i = 0; i <m; i ++){
printf( "inputPoint with startPoint endPoint weitht:\ n");
scanf( "%d%d%d"、&x、&y、&z);
addArc(x、y、z、isDigraph);
}
calculatePath();
printf( "すべての最短距離とパスをリスト:\ n");
for(i = 0; i <n; i ++)
{
for(j = 0; j <n; j ++)
{
getShortestPath(i、j);
}
}
0を返します。
}