floyd演算法的理解

2021-07-04 18:16:05 字數 673 閱讀 8540

floyd演算法適用於apsp(all pairs shortestpaths,多源最短路徑),是一種動態規劃方法

對於稠密圖(點的密集度高),執行效率要高於dijkstra和spfa演算法,這種方法是用二維數

組來儲存點與點之間的距離,所以不適合有大量的點,就像點i到點j之間的距離就儲存

在map[i][j]裡

接下來講講三重迴圈:

for(k=0;kj=5,i=7-> k=6 + k=6 -> j=5);

而且我們會發現spfa當中的負環判斷在這個迴圈當中也是有體現的,我們知道負環判斷條件是乙個點進入佇列的

次數是否大於點的個數, 即 if(used>n) printf("存在負環\n"); (這個演算法判斷不了負環,我只是連線一下知識,因為每個點迴圈n次,並不會出現死迴圈)

那麼此處體現在這裡:當k=0,i=0時,我們就會把j=0迴圈到j=n-1,此時k=0這個點相當於進入佇列一次,接著更新

與k=0這個點相連線的點的值,即map, 然後i=1...到i=n-1,那麼 總共算起來,k=0這個點就迴圈了n次了,所我覺得floyd演算法

還是不錯的,不過就是每個點都迴圈了n次,這個就降低效率了,不過這也保證了所有點之間的距離都會更新到最小值

今天就弄到這裡,以後再回過頭來理解一遍,說不定到時候會與跟多的知識連線起來

深入理解floyd演算法

先上floyd演算法的 本質上是動態規劃問題 本質就是dp含有動態規劃的思想,滿足重疊子問題和最優子結構 dis k i j min dis k 1 i j dis k 1 i k dis k 1 k j 我們可以發現他其實是由前k 1的狀態來推出第k個點的狀態之後你就會發現f k 只與f k 1 ...

深入理解Floyd演算法思路

floyd演算法經典 只有5行 或者也可以寫成4行 思路聽起來也那麼 顯然 但大部分人對floyd演算法的理解僅僅限於它的實現是三層迴圈,k在最外層,i和j在內層不分順序,用路徑鬆弛來更新最短路徑。但其實大多數人都沒有弄清楚乙個問題,為什麼外層迴圈是遍歷k,而不是把k放到最內層呢,只是知道放在裡邊就...

Floyd 動態規劃的理解

這裡我一直好奇的是這三個漂亮的迴圈是怎麼完成最終正確的結果的,如何證明它們是正確的。直到看了這裡的解析,才算弄懂了。floyd演算法是乙個經典的動態規劃演算法。用通俗的語言來描述的話,首先我們的目標是尋找從點i到點j的最短路徑。從動態規劃的角度看問題,我們需要為這個目標重新做乙個詮釋 這個詮釋正是動...