弗洛伊德(floyd)演算法過程:
1、用d[v][w]記錄每一對頂點的最短距離。
2、依次掃瞄每乙個點,並以其為基點再遍歷所有每一對頂點d的值,看看是否可用過該基點讓這對頂點間的距離更小。
演算法理解:
最短距離有三種情況:
1、兩點的直達距離最短。(如下圖)
2、兩點間只通過乙個中間點而距離最短。(圖)
3、兩點間用通過兩各以上的頂點而距離最短。(圖)
對於第一種情況:在初始化的時候就已經找出來了且以後也不會更改到。
對於第二種情況:弗洛伊德演算法的基本操作就是對於每一對頂點,遍歷所有其它頂點,看看可否通過這乙個頂點讓這對頂點距離更短,也就是遍歷了圖中所有的三角形(演算法中對同乙個三角形掃瞄了九次,原則上只用掃瞄三次即可,但要加入判斷,效率更低)。
對於第三種情況:如下圖的五邊形,可先找一點(比如x,使=2),就變成了四邊形問題,再找一點(比如y,使=2),可變成三角形問題了(v,u,w),也就變成第二種情況了,由此對於n邊形也可以一步步轉化成四邊形三角形問題。(這裡面不用擔心哪個點要先找哪個點要後找,因為找了任乙個點都可以使其變成(n-1)邊形的問題)。
刺蝟加註:
floyd的核心**:
0;k<
g.vexnum;k++)
結合** 並參照上圖所示 我們來模擬執行下 這樣才能加深理解:
第一關鍵步驟:當k執行到x,i=v,j=u時,計算出v到u的最短路徑要通過x,此時v、u聯通了。
第二關鍵步驟:當k執行到u,i=v,j=y,此時計算出v到y的最短路徑的最短路徑為v到u,再到y(此時v到u的最短路徑上一步我們已經計算過來,直接利用上步結果)。
第三關鍵步驟:當k執行到y時,i=v,j=w,此時計算出最短路徑為v到y(此時v到y的最短路徑長在第二步我們已經計算出來了),再從y到w。
依次掃瞄每一點(k),並以該點作為中介點,計算出通過k點的其他任意兩點(i,j)的最短距離,這就是floyd演算法的精髓!同時也解釋了為什麼k點這個中介點要放在最外層迴圈的原因.
弗洛伊德 Floyd 演算法
和dijkstra演算法一樣,弗洛伊德 floyd 演算法也是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。該演算法名稱以創始人之一 1978年圖靈獎獲得者 史丹福大學電腦科學系教授羅伯特 弗洛伊德命名 弗洛伊德演算法 floyd 計算圖中各個頂點之間的最短路徑 迪傑斯特拉演算法用於計算圖中某乙...
弗洛伊德 Floyd 演算法
佛羅依德 floyd 演算法的基本思想 設圖g用鄰接矩陣法表示,求圖g中任意一對頂點vi與vj間的的最短路徑。1 將vi到vj的最短的路徑長度初始化為g.arcs i j adj,進行如下n次比較和修正 0 在vi與vj間加入頂點v0,比較 vi,v0,vj 和 vi,vj 的路徑的長度,取其中較短...
弗洛伊德(Floyd)演算法入門
這個演算法其實是在基於動態規劃演算法之上 類似於01揹包 進行設想的 部分 和思路參考自最短路徑演算法 設di,j,k為從i到j的只以 1 k 集合中結點為中間結點的最短路徑的長度,那麼按照01揹包的思維就是1.從頂點i到頂點j是不經過k的,那麼就是dijk 1,2.如果確實經過k的話,就把兩個頂點...