單源最短路徑

問題描述:

給定一個帶權有向圖 G=(V,E) ,其中每條邊的權是一個非負實數。另外,還給定 V 中的一個頂點,稱爲源。現在我們要計算從源到所有其他各頂點的最短路徑長度。這裏的長度是指路上各邊權之和。這個問題通常稱爲單源最短路徑問題。

解決方案:

Dijkstra提出按各頂點與源點v間的路徑長度的遞增次序,生成到各頂點的最短路徑的算法。既先求出長度最短的一條最短路徑,再參照它求出長度次短的一條最短路徑,依次類推,直到從源點v 到其它各頂點的最短路徑全部求出爲止。

解決思想:

將圖G中所有的頂點V分成兩個頂點集合S和T。以v爲源點已經確定了最短路徑的終點併入S集合中,S初始時只含頂點v,T則是尚未確定到源點v最短路徑的頂點集合。

  具體步驟

  1、選一頂點v爲源點,並視從源點v出發的所有邊爲到各頂點的最短路徑(確定數據結構:因爲求的是最短路徑,所以1.就要用一個記錄從源點v到其它各頂點的路徑長度數組dist[],開始時,dist是源點v到頂點i的直接邊長度,即dist中記錄的是鄰接陣的第v行。2.設一個用來記錄從源點到其它頂點的路徑數組path[],path中存放路徑上第i個頂點的前驅頂點)。

  2、在上述的最短路徑dist[]中選一條最短的,並將其終點(即<v,k>)k加入到集合s中。

  3、調整T中各頂點到源點v的最短路徑。因爲當頂點k加入到集合s中後,源點v到T中剩餘的其它頂點j就又增加了經過頂點k到達j的路徑,這條路徑可能要比源點v到j原來的最短的還要短。調整方法是取dist[k]+g[k,j]<dist[j]與dist[j]的較小者。

  4、再選出一個到源點v路徑長度最小的頂點k,從T中刪去後加入S中,再回去到第三步,如此重複,直到集合S中的包含圖G的所有頂點。

Dijkstra算法實現:

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