http://2728green-rock.blog.163.com/blog/static/43636790200901211848284/web
1 最短路徑算法算法
在平常生活中,咱們若是須要經常往返A地區和B地區之間,咱們最但願知道的多是從A地區到B地區間的衆多路徑中,那一條路徑的路途最短。最短路徑問題是圖論研究中的一個經典算法問題, 旨在尋找圖(由結點和路徑組成的)中兩結點之間的最短路徑。 算法具體的形式包括:數據結構
(1)肯定起點的最短路徑問題:即已知起始結點,求最短路徑的問題。spa
(2)肯定終點的最短路徑問題:與肯定起點的問題相反,該問題是已知終結結點,求最短路徑的問題。在無向圖中該問題與肯定起點的問題徹底等同,在有向圖中該問題等同於把全部路徑方向反轉的肯定起點的問題。.net
(3)肯定起點終點的最短路徑問題:即已知起點和終點,求兩結點之間的最短路徑。日誌
(4)全局最短路徑問題:求圖中全部的最短路徑。orm
用於解決最短路徑問題的算法被稱作「最短路徑算法」, 有時被簡稱做「路徑算法」。 最經常使用的路徑算法有:Dijkstra算法、A*算法、Bellman-Ford算法、Floyd-Warshall算法、Johnson算法。htm
本文主要研究Dijkstra算法的單源算法。blog
2 Dijkstra算法教程
Dijkstra算法是典型最短路算法,用於計算一個節點到其餘全部節點的最短路徑。主要特色是以起始點爲中心向外層層擴展,直到擴展到終點爲止。Dijkstra算法能得出最短路徑的最優解,但因爲它遍歷計算的節點不少,因此效率低。
Dijkstra算法是頗有表明性的最短路算法,在不少專業課程中都做爲基本內容有詳細的介紹,如數據結構,圖論,運籌學等等。
2.2 Dijkstra算法思想
Dijkstra算法思想爲:設G=(V,E)是一個帶權有向圖,把圖中頂點集合V分紅兩組,第一組爲已求出最短路徑的頂點集合(用S表示,初始時S中只有一個源點,之後每求得一條最短路徑 , 就將 加入到集合S中,直到所有頂點都加入到S中,算法就結束了),第二組爲其他未肯定最短路徑的頂點集合(用U表示),按最短路徑長度的遞增次序依次把第二組的頂點加入S中。在加入的過程當中,總保持從源點v到S中各頂點的最短路徑長度不大於從源點v到U中任何頂點的最短路徑長度。此外,每一個頂點對應一個距離,S中的頂點的距離就是從v到此頂點的最短路徑長度,U中的頂點的距離,是從v到此頂點只包括S中的頂點爲中間頂點的當前最短路徑長度。
2.3 Dijkstra算法具體步驟
(1)初始時,S只包含源點,即S=,v的距離爲0。U包含除v外的其餘頂點,U中頂點u距離爲邊上的權(若v與u有邊)或 )(若u不是v的出邊鄰接點)。
(2)從U中選取一個距離v最小的頂點k,把k,加入S中(該選定的距離就是v到k的最短路徑長度)。
(3)以k爲新考慮的中間點,修改U中各頂點的距離;若從源點v到頂點u(u U)的距離(通過頂點k)比原來距離(不通過頂點k)短,則修改頂點u的距離值,修改後的距離值的頂點k的距離加上邊上的權。
(4)重複步驟(2)和(3)直到全部頂點都包含在S中。
2.4 Dijkstra算法舉例說明
以下圖,設A爲源點,求A到其餘各頂點(B、C、D、E、F)的最短路徑。線上所標註爲相鄰線段之間的距離,即權值。(注:此圖爲隨意所畫,其相鄰頂點間的距離與圖中的目視長度不能一一對等)
圖一:Dijkstra無向圖
算法執行步驟以下表:【注:圖片要是看不到請到「相冊--日誌相冊」中,名爲「Dijkstra算法過程」的圖就是了】
[1] 黃國瑜、葉乃菁,數據結構,清華大學出版社,2001年8月第1版
[2] 最短路徑,http://baike.baidu.com/view/349189.htm?func=retitle
[3] 李春葆,數據結構教程,清華大學出版社,2005年1月第1版
[3] Dijkstra算法,http://baike.baidu.com/view/7839.htm