參考:
http://2728green-rock.blog.163.com/blog/static/43636790200901211848284/
http://hi.baidu.com/chin/blog/item/93aed933e6772443ad4b5f88.html
描述:
Dijkstra演算法思想為:設G=(V,E)是一個帶權有向圖,把圖中頂點集合V分成兩組,第一組為已求出最短路徑的頂點集合(用S表示,初始時S中只有一個源點,以後每求得一條最短路徑 , 就將 加入到集合S中,直到全部頂點都加入到S中,演算法就結束了),第二組為其餘未確定最短路徑的頂點集合(用U表示),按最短路徑長度的遞增次序依次把第二組的頂點加入S中。在加入的過程中,總保持從源點v到S中各頂點的最短路徑長度不大於從源點v到U中任何頂點的最短路徑長度。此外,每個頂點對應一個距離,S中的頂點的距離就是從v到此頂點的最短路徑長度,U中的頂點的距離,是從v到此頂點只包括S中的頂點為中間頂點的當前最短路徑長度。
說明:
V表示點集合,E表示邊集合,圖G=(V,E)表示圖是由點集合與點之間的連線組成,如V={a,b,c,d}表示圖G有a,b,c,d四個點,E={(a,b),(a,c),(c,d),(b,d)},表示圖有a-b,a-c等邊,一般<a,b>這樣的角括弧表示有向邊,(a,b) 這樣的圓括弧表示無向邊。
有點集合V={a,b,c,d,e,f}
S表示已計算出最短路徑(假設a為源點)的頂點集合 ,U表示除S中點以外的點的集合,U中每個點ui都對應著一個距離值a--ui(存在a到ui的邊),a--ui這個距離值可取無窮大(兩點沒有直接連線),或是經過S中的某一個或多個點a--si--ui的距離值。
1.S中第一個加入的點是a,加入a後a-a的距離是零,滿足S中的點必需是計算出最短路徑的要求.
2.接著在U中選擇最短的a-ui,假設ui是d,將d加入集合S,此時S={a,d},然後嘗試使用a-d-ui調整U={c,d,e,f}中每個點a--ui的距離(如果通過新加的d點使a--ui距離變短).
3.重複步驟2,直到U集合中沒有點,演算法結束S中將是a到任意點的最短距離。