最短路徑 弗洛伊德 Floyd 演算法

2021-07-29 14:32:00 字數 1331 閱讀 1675

弗洛伊德(floyd)演算法

是解決任意兩點間的最短路徑的一種演算法 

floyd演算法是乙個經典的動態規劃演算法

。用通俗的語言來描述的話,首先我們的目標是尋找從點i到點j的最短路徑。從動態規劃的角度看問題,我們需要為這個目標重新做乙個詮釋(這個詮釋正是動態規劃最富創造力的精華所在)

從任意節點i到任意節點j的最短路徑不外乎2種可能,1是直接從i到j,2是從i經過若干個節點k到j。所以,我們假設dis(i,j)為節點u到節點v的最短路徑的距離,對於每乙個節點k,我們

檢查dis(i,k) + dis(k,j) < dis(i,j)是否成立

,如果成立,證明從i到k再到j的路徑比i直接到j的路徑短,我們

便設定dis(i,j) = dis(i,k) + dis(k,j

),這樣一來,當我們遍歷完所有節點k,dis(i,j)中記錄的便是i到j的最短路徑的距離

2).演算法描述:

a.從任意一條單邊路徑開始。所有兩點之間的距離是邊的權,如果兩點之間沒有邊相連,則權為無窮大。   

b.對於每一對頂點 u 和 v,看看是否存在乙個頂點 w 使得從 u 到 w 再到 v 比己知的路徑更短。如果是更新它。

為了能講明白弗洛伊德演算法的精妙所在,我們先來看最簡單的案例:

弗洛伊德演算法

d1[0][2] = min

弗洛伊德演算法

floyd

floyd

這是我們求v0到個點的距離則看v0對應的一行或者一列就好了此時為 此為距離值

求路徑是 看

v0->v8 第一行為p[0][8]=1 用到v1

看v1->v8 第一行為p[1][8]=2 用到

v2看v2->v8 第一行為p[2][8]=4 用到v4

看v4->v8 第一行為p[4][8]=3 用到v3

看v3->v8 第一行為p[3][8]=6 用到v6

看v6->v8 第一行為p[6][8]=7 用到v7

看v7->v8 第一行為p[7][8]=8 用到v8

路徑為v0

->

v1->

v2->

v4->

v3->

v6->

v7->v8

typedef struct  

mgraph;

void floyd(mgraph g)

} }

} } //求最短路徑的顯示**可以這樣寫

void printway(mgraph g, int* a, int* path)

{ for(int i=0;i"

最短路徑演算法 弗洛伊德(Floyd)演算法

在這篇部落格中我主要講解最短路徑演算法中的floyd演算法,這是針對多源最短路徑的乙個經典演算法。對於單源最短路徑演算法請詳見我的另一篇部落格 最短路徑演算法 上 迪傑斯特拉 dijikstra 演算法 弗洛伊德 floyd 演算法是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或有向圖或...

演算法 最短路徑之弗洛伊德(Floyd)演算法

為了能講明白弗洛伊德 floyd 演算法的主要思想,我們先來看最簡單的案例。圖7 7 12的左圖是乙個簡單的3個頂點的連通網圖。我們先定義兩個二維陣列d 3 3 和p 3 3 d代表頂點與頂點的最短路徑權值和的矩陣。p代表對應頂點的最短路徑的前驅矩陣。在未分析任何頂點之前,我們將d命名為d 1 其實...

最短路徑之弗洛伊德演算法(Floyd) 動態規劃

弗洛伊德演算法 floyd 主要針對多源最短路徑,且可以解決路徑中有負權的情況 不包含負權迴路 但是迪傑斯特拉演算法只能解決正權值的單源最短路徑 可以迭代多次求多源 1.弗洛伊德演算法的基本思想 弗洛伊德演算法從圖的帶權鄰接矩陣cost出發,假設求從頂點viv vi 到vjv vj 的最短路徑 如果...