弗洛伊德算法-python

1 解決的問題

從某一點到達任意一點的最短距離,任意兩個節點之間的最短距離

來源https://blog.csdn.net/shezjoe/article/details/80670188

 

2 思想

找一箇中間點,經過中間點的距離與不經過中間點的距離是不是更小

例如: 1 -> 3

不經過中間點 d13 = 6

加入經過2,d12 + d23 = 2 + 3 =5 < d13

所以經過2比d13更好點,可能會有更好的中間點,這就需要遍歷每一個頂點

3 代碼實現

核心代碼

利用動態規劃

for k in range(n):
        for i in range(n):
            for j in range(n):
                if(dp[i][k]+dp[j][k] < dp[i][j]): 
                    dp[i][j] = dp[i][k]+dp[j][k]       

4 與迪傑斯特拉算法的區別

感覺迪傑斯特拉算法也用了中間點連接,但不是用所有的,有選擇性的使用

 

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

原文

https://blog.csdn.net/Harington/article/details/81982299

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