1. 程式人生 > >【模板】單源最短路徑——Floyd

【模板】單源最短路徑——Floyd

表示 而且 鄰接 正是 內容 tle code spa 可能

抱歉這幾天 晚上一直認真 (頹廢)打模擬賽 一直沒寫博客 然後今天學了最短路 然後 馬上過來碼一下

以下內容 有的是搬得那些大佬們得博客 也謝謝他們

1.Floyd

感覺 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 比己知的路徑更短。如果是更新它。

3).Floyd算法過程矩陣的計算----十字交叉法

方法:兩條線,從左上角開始計算一直到右下角 如下所示

給出矩陣,其中矩陣A是鄰接矩陣,而矩陣Path記錄u,v兩點之間最短路徑所必須經過的點

技術分享圖片

相應計算方法如下:

技術分享圖片

技術分享圖片

技術分享圖片

最後A3即為所求結果

看一下代碼:

//直接上核心部分吧

for(int k=1;k<=n;k++)//
中間點 for(int i=1;i<=n;i++)// i,j 表示 i -> j點 for(int j=1;j<=n;j++) g[i][j]=min(g[i][j],g[i][k]+g[k][j]);

【模板】單源最短路徑——Floyd