最短路徑算法——Floyd算法


 

基本思想: 
弗洛伊德算法定義了兩個二維矩陣:

  1. 矩陣D記錄頂點間的最小路徑 
    例如D[0][3]= 10,說明頂點0 到 3 的最短路徑為10;
  2. 矩陣P記錄頂點間最小路徑中的中轉點 
    例如P[0][3]= 1 說明,0 到 3的最短路徑軌跡為:0 -> 1 -> 3。

它通過3重循環,k為中轉點,v為起點,w為終點,循環比較D[v][w] 和 D[v][k] + D[k][w] 最小值,如果D[v][k] + D[k][w] 為更小值,則把D[v][k] + D[k][w] 覆蓋保存在D[v][w]中。

如下圖:

對應的鄰接矩陣

最終結果

代碼:

#include <iostream>
#include <cstring>

#define MAX 9
#define INF 0xFFFF

int floyd(int matrix[][MAX], int prevPoint[][MAX], int finalP2V[][MAX])
{
    int i,j,k;

    for (i=0; i<MAX; i++)
        for (j=0; j<MAX; j++)
        {
            finalP2V[i][j] = matrix[i][j];
            prevPoint[i][j] = j;
        }

    for (k=0; k<MAX; k++)
        for (i=0; i<MAX; i++)
            for(j=0; j<MAX; j++)
            {
                if (finalP2V[i][j] > (finalP2V[i][k]+finalP2V[k][j]))
                {
                    finalP2V[i][j] = finalP2V[i][k]+finalP2V[k][j];
                    prevPoint[i][j] = prevPoint[i][k];
                }
            }
}

int main(int argc, char *argv[])
{
    int matrix[][MAX] = {{0, 1, 5, INF, INF, INF, INF, INF, INF},
                                  {1, 0, 3, 7, 5, INF, INF, INF, INF},
                                  {5, 3, 0, INF, 1, 7, INF, INF, INF },
                                  {INF, 7,INF, 0, 2, INF, 3, INF, INF},
                                  {INF, 5, 1, 2, 0, 3, 6, 9, INF},
                                  {INF, INF, 7, INF, 3, 0, INF, 5, INF},
                                  {INF, INF, INF, 3, 6, INF, 0, 2, 7},
                                  {INF, INF, INF, INF, 9, 5, 2, 0, 4},
                                  {INF, INF, INF, INF, INF, INF, 7, 4, 0}};

    int prevPoint[MAX][MAX] = {0};
    int finalP2V[MAX][MAX] = {0};

    floyd(matrix, prevPoint, finalP2V);

    for (int i=0; i<MAX; i++)
    {
        for (int j=0; j<MAX; j++)
        {
            std::cout << finalP2V[i][j] << " ";
        }
        std::cout << std::endl;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM