為什麼Dijkstra演算法每輪遞推能夠保證找到一個頂點的最短路徑?
01-03
初學圖論的一個問題。
每次遍歷未確定最短路徑的頂點集T,找到從v0到T中所有點中,當前路徑最短的那個頂點vk。為什麼能夠保證這個當前的路徑長度就一定是最終確定的最短的路徑長度?
好好看書的話這個問題應該不難理解吧,首先Dijkstra演算法成立的前提條件是不存在負權的邊,這意味任何一條路徑,從起點開始到路徑中每個點的距離都是依次遞增的。所以按照遞增的順序來依次計算出最短路徑也就是Dijkstra演算法了。
為了簡單起見,我們可以認為所有的邊權都是正值。如果有邊的權值為0,則這個邊的兩個頂點到源點的最短距離一定相等,可以把它們看成是同一個頂點,這樣只要證明了邊權值為正值的情況,也就能進一步推廣到有邊權值為0的情況。當我們計算最短路徑的時候,源點到任意一個點的最短距離,要麼是源點到它的某條邊的長度,要麼是源點到另一個點的最短距離距離,再加上另一個點到這個點的邊的長度,寫成公式就是:注意到我們有,假如我們已經提前知道了各個d(i)的大小順序,那麼比該頂點的最短路徑距離更長的點就不用考慮了,改寫成:
假想我們已經提前將d(i)排好了序,除了源點以外,最近的是,然後是,然後是,也就是那麼就有:假如說我們現在已經知道了最短距離最小的前k個節點——特別的,k = 0的時候,這些節點的集合是個空集。當然它們的最短距離也根據上面的式子算了出來。我們希望接下來,通過這些信息找到,並且計算出。
我們回到最早的式子中https://www.quora.com/What-is-the-simplest-intuitive-proof-of-Dijkstra%E2%80%99s-shortest-path-algorithm
原因很簡單:如果你想到達其它沒有標記長度的節點,就必須經過那些已經被標記過長度的節點,所以。。。
因為每次選vertex的時候選的是label最小的vertex。然後所選vertex的所有連接的鄰居,都會把鄰居的label更新成最短的路徑的長度。
很簡單,因為每次循環都會增多一個保證已經找到最短路的點。
設當前路徑最短的頂點為Vu,距離為d。意味著V0到達T中其他頂點的距離大於d。那麼,假設要以這些頂點為「中轉站」,則V0到達Vu的距離肯定更加大於d。所以,當前最短的頂點的最短路徑就是d。
自己好好做作業,不要到知乎騙答案。
推薦閱讀:
※任何密碼都可以用窮舉推算出來,只是時間問題。如果是這樣的話,那不是很不安全?
※如何證明Manacher演算法的時間複雜度是O(n)?
※如何看待用中國大陸地區境內的搜索引擎搜索主席樹得到的結果文不對題?
※有哪些演算法是中國人自己創造的?
※有哪些有趣的樹結構的表示方法?