一、問題:圖的最短路徑
定義圖G=(V,E),而且每條邊上的權值非負,求頂點s 到圖中任意一點的最短距離。圖中任意兩點之間的距離定義為:路徑上所有邊的權值的和。
二、算法:Dijkstra算法
設S是探查的頂點的集合,對每個,我們存儲一個距離d(u)
初始S={s},d(s)=0
While S != V
選擇一個頂點使得從S到v至少有一條邊並且
把v加入到S並且定義
End
三、證明算法的正確性:
只需證明,在算法執行中任意一點的集合S,對每個,路徑是最短的s-u路徑。
用數學歸納法證明算法的正確性:
- |S|=1 時, S={s},d(s)=0 顯然成立
- 假設|S|=k時,命題成立
既對每個,路徑Pu是最短的s-u路徑
3. |S|=k+1
假設此時引入的頂點是v,令(u,v)是s-v路徑上最后的一條邊。
現在我們證明是s-v的所有路徑中最短的路徑。
s要到達v,必須首先離開S,然后到達y,最后y到達v
該距離:
而從Dijkstra算法知,
又因為,圖中所有邊的權值非負,
所以有:
故而Pv是s-v的所有路徑中最短的路徑。