通過dijkstra計算圖g中的最短路徑時,需要指定起點s(即從頂點s開始計算)。此外,引進兩個集合s和u。s的作用是記錄已求出最短路徑的頂點(以及相應的最短路徑長度),而u則是記錄還未求出最短路徑的頂點(以及該頂點到起點s的距離)。
初始時,s中只有起點s;u中是除s之外的頂點,並且u中頂點的路徑是」起點s到該頂點的路徑」。然後,從u中找出路徑最短的頂點,並將其加入到s中;接著,更新u中的頂點和頂點對應的路徑。 然後,再從u中找出路徑最短的頂點,並將其加入到s中;接著,更新u中的頂點和頂點對應的路徑。 … 重複該操作,直到遍歷完所有頂點。
初始時,s只包含起點s;u包含除s外的其他頂點,且u中頂點的距離為」起點s到該頂點的距離」[例如,u中頂點v的距離為(s,v)的長度,然後s和v不相鄰,則v的距離為∞]
從u中選出」距離最短的頂點k」,並將頂點k加入到s中;同時,從u中移除頂點k。
更新u中各個頂點到起點s的距離。之所以更新u中頂點的距離,是由於上一步中確定了k是求出最短路徑的頂點,從而可以利用k來更新其它頂點的距離;例如,(s,v)的距離可能大於(s,k)+(k,v)的距離。
重複步驟(2)和(3),直到遍歷完所有頂點。
單純的看上面的理論可能比較難以理解,下面通過例項來對該演算法進行說明。
以上圖g4為例,來對迪傑斯特拉進行演算法演示(以第4個頂點d為起點)。以下b節點中23應為13。
初始狀態:s是已計算出最短路徑的頂點集合,u是未計算除最短路徑的頂點的集合!
第1步:將頂點d加入到s中。
此時,s=, u=。 注:c(3)表示c到起點d的距離是3。
第2步:將頂點c加入到s中。
上一步操作之後,u中頂點c到起點d的距離最短;因此,將c加入到s中,同時更新u中頂點的距離。以頂點f為例,之前f到d的距離為∞;但是將c加入到s之後,f到d的距離為9=(f,c)+(c,d)。
此時,s=, u=。
第3步:將頂點e加入到s中。
上一步操作之後,u中頂點e到起點d的距離最短;因此,將e加入到s中,同時更新u中頂點的距離。還是以頂點f為例,之前f到d的距離為9;但是將e加入到s之後,f到d的距離為6=(f,e)+(e,d)。
此時,s=, u=。
第4步:將頂點f加入到s中。
此時,s=, u=。
第5步:將頂點g加入到s中。
此時,s=, u=。
第6步:將頂點b加入到s中。
此時,s=, u=。
第7步:將頂點a加入到s中。
此時,s=。
此時,起點d到各個頂點的最短距離就計算出來了:a(22) b(13) c(3) d(0) e(4) f(6) g(12)。
**鄰接矩陣為例,
graph是鄰接矩陣對應的結構體。// 鄰接矩陣
typedef struct _graph
graph, *pgraph;
// 邊的結構體
typedef struct _edgedata
edata;
vexs用於儲存頂點,vexnum是頂點數,edgnum是邊數;matrix則是用於儲存矩陣資訊的二維陣列。
例如,matrix[i][j]=1,則表示」頂點i(即vexs[i])」和」頂點j(即vexs[j])」是鄰接點;matrix[i][j]=0,則表示它們不是鄰接點。
edata是鄰接矩陣邊對應的結構體。
dijkstra演算法
/* * dijkstra最短路徑。
* 即,統計圖(g)中"頂點vs"到其它各個頂點的最短路徑。
* * 引數說明:
* g -- 圖
* vs -- 起始頂點(start vertex)。即計算"頂點vs"到其它頂點的最短路徑。
* prev -- 前驅頂點陣列。即,prev[i]的值是"頂點vs"到"頂點i"的最短路徑所經歷的全部頂點中,位於"頂點i"之前的那個頂點。
* dist -- 長度陣列。即,dist[i]是"頂點vs"到"頂點i"的最短路徑的長度。
*/void dijkstra(graph g, int vs, int prev, int dist)
// 對"頂點vs"自身進行初始化
flag[vs] = 1;
dist[vs] = 0;
// 遍歷g.vexnum-1次;每次找出乙個頂點的最短路徑。
for (i = 1; i < g.vexnum; i++)
{// 尋找當前最小的路徑;
// 即,在未獲取最短路徑的頂點中,找到離vs最近的頂點(k)。
min = inf;
for (j = 0; j < g.vexnum; j++)
{if (flag[j]==0 && dist[j]
參考資料
全域性路徑規劃 01 Dijkstra演算法
應用場景 城市路網的路徑規劃 演算法流程 初始時,s集只包含起點s,u集包含除s外的其他節點,u集中的節點v與起點s相鄰,則該節點儲存值為距起點s的距離,若與起點s不相鄰,則距離為無限大 從u集中選出距離起點最短的節點k,並將節點k加入到s集中,同時從u集中移除節點k 更新u集中各個節點到起點s的距...
Dijkstra 路徑規劃 C
示例無向圖如下 起始點為v0 鄰接矩陣為 注意 其中沒有連線的邊和自己到自己的點權值用10000表示。static void main string args int n 6 int s new int n 最短路徑的頂點集合 string mid new string n 點的路線 for int...
最優路徑之 Dijkstra
求在乙個加權有向無環圖中,從起點到終點的最短路徑 圖中有四個節點,分別為 start,a,b,end 各個節點間的路徑長度如下 start a 6 start b 2 a end 1 b a 3 b end 5 終點 無 答案 最短路徑為 start b a end 6 usr bin env py...