最短路徑之dijistra

dijistra算法:跑過一邊之後就把源點到所有點的最短距離都求出來了

算法思想其實應該屬於DP,因爲這個問題有着明顯的最優子結構

d[y]是指源點到y的最短距離,那顯而易見:d[y] = min{d[x]+w(x,y)}

這個和一般的dp題代碼有點區別,因爲一般的都是根據下標來推下一個,而這個點之間的連接要靠圖來判斷

最重要的區別是初始化的時候只有一個值是已知的,就是所有源點直接相鄰的點中d[]最小的那個點,其它的都是不確定的

所以這個遞推式真正的寫法應該式d[y] = min{d[y],d[x]+w(x,y)}因爲每次比較只能得到一個真正的結果

 

如果讓我描述一下核心思想,差不多就是:一個最短路中經過的任意兩點間的路也一定是最短路,所以當求出一個點的最短路的時候就可以用它去更新其它的點了。

所以每輪選擇的dis[i]最小值一定是正確的,因爲若不是選這條路,是任意的其它路在加一段,任意的其他路都一定比dis[i]大了,別說再加一段了。

不能用dijistra做最長路問題

因爲dijistra求最短路的主要步驟是在所有沒有加入集合的點的dis[]數組中每次選最小的,就一定是最小的,這就是關鍵所在了,若是求最長路,每次選最大的是未必正確的

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