Floyd算法簡介

文章:https://blog.csdn.net/qq_34374664/article/details/52261597

核心代碼:

#include <iostream>
using namespace std;
int main()
{
    int e[10][10],k,i,j,n,m,t1,t2,t3;
    int inf=99999999; //用inf(infinity的縮寫)存儲一個我們認爲的正無窮值
    //讀入n和m,n表示頂點個數,m表示邊的條數
    scanf("%d %d",&n,&m);
    //初始化
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(i==j) e[i][j]=0;  
              else e[i][j]=inf;

    //讀入邊
    for(i=1;i<=m;i++)
    {
        scanf("%d %d %d",&t1,&t2,&t3);
        e[t1][t2]=t3;
    }
    //Floyd-Warshall算法核心語句
    for(k=1;k<=n;k++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(e[i][j]>e[i][k]+e[k][j] ) 
                    e[i][j]=e[i][k]+e[k][j];
    //輸出最終的結果
    for(i=1;i<=n;i++)
    {
     for(j=1;j<=n;j++)
        {
            printf("%10d",e[i][j]);
        }
        printf("\n");
    }
    return 0;
}

Floyd優缺點分析

優點:容易理解,可以算出任意兩個節點之間的最短距離,代碼編寫簡單。
缺點:時間複雜度比較高(n3),不適合計算大量數據。

Floyd算法與Dijkstra算法的不同

1.Floyd算法是求任意兩點之間的距離,是多源最短路,而Dijkstra(迪傑斯特拉)算法是求一個頂點到其他所有頂點的最短路徑,是單源最短路。
2.Floyd算法可以算帶負權的,而Dijkstra(迪傑斯特拉)算法是不可以算帶負權的。並且Floyd算法不能算負權迴路。
3.Dijkstra(迪傑斯特拉)算法時間複雜度一般是o(n^2),Floyd算法時間複雜度是o(n^3),Dijkstra(迪傑斯特拉)算法比Floyd算法塊。
4.Floyd算法屬於動態規劃,Dijkstra(迪傑斯特拉)算法屬於貪心算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章