弗洛伊德(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 的最短路徑 如果...