フロイドアルゴリズムのC ++実装

フロイドアルゴリズムは、補間法とも呼ばれ、動的プログラミングのアイデアを使用して、特定の加重グラフ内の複数のソースポイント間最短経路を見つけるアルゴリズムです

このペーパーでは、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を返します。
}

31件の元の記事を公開 いいね3 2028訪問

おすすめ

転載: blog.csdn.net/lclfans1983/article/details/105391628