基本思想:
通過dijkstra計算圖g中的最短路徑時,需要指定起點s(即從頂點s開始計算)。
此外,引進兩個集合s和u。s的作用是記錄已求出最短路徑的頂點(以及相應的最短路徑長度),而u則是記錄還未求出最短路徑的頂點(以及該頂點到起點s的距離)。
初始時,s中只有起點s;u中是除s之外的頂點,並且u中頂點的路徑是"起點s到該頂點的路徑"。然後,從u中找出路徑最短的頂點,並將其加入到s中;
接著,更新u中的頂點和頂點對應的路徑。 然後,再從u中找出路徑最短的頂點,並將其加入到s中;接著,更新u中的頂點和頂點對應的路徑。 ... 重複該操作,
直到遍歷完所有頂點。
操作步驟:
(1)初始時,s只包含起點s;u包含除s外的其他頂點,且u中頂點的距離為"起點s到該頂點的距離"[例如,u中頂點v的距離為(s,v)的長度,然後s和v不相鄰,則v的距離為∞]。
(2)從u中選出"距離最短的頂點k",並將頂點k加入到s中;同時,從u中移除頂點k。
(3)更新u中各個頂點到起點s的距離。之所以更新u中頂點的距離,是由於上一步中確定了k是求出最短路徑的頂點,從而可以利用k來更新其它頂點的距離;例如,(s,v)的距離可能大於(s,k)+(k,v)的距離。
(4)重複步驟(2)和(3),直到遍歷完所有頂點。
單純的看上面的理論可能比較難以理解,下面通過例項來對該演算法進行說明。
以上圖g4為例,來對迪傑斯特拉進行演算法演示(以第4個頂點d為起點)。
初始狀態: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)。
**如下:
1 #include "示例展示:stdafx.h
"2 #include3 #include
4#define max_vertex_num 100
5#define infinity 65535
6 typedef int pathmatirx[max_vertex_num];//
存放最短路徑下標的陣列
7 typedef int shortpathtable[max_vertex_num];//
存放到各頂點最短路徑的權值之和
8using
namespace
std;
9 typedef struct graph //
有向圖的鄰接矩陣
10graph;
1516
int locatevex(graph g, char ch) //
搜尋17
2324
void creategraph(graph &g) //
建立無向圖
2535
for (i = 0; i < g.vexnum; i++)
36for (j = 0; j < g.vexnum; j++)
37 g.arcs[i][j] =infinity;
38 cout << "
請輸入弧尾、弧頭以及權值:
"<
39for (int k = 0; k < g.arcnum; k++)
4046}47
48void shortestpath_dijkstra(graph g, int v0, int prev, int dist)//
迪傑斯特拉演算法
49 58 dist[v0] = 0; //
v0至v0的路徑為0
59 final[v0] = 1; //
v0至v0不需要求路徑
60for (v = 1; v < g.vexnum; v++)//
開始主迴圈,每次求得v0到某個v頂點的最短路徑
6170
}71 final[k] = 1; //
將目前找到的最近的頂點值為1
72for (w = 0; w < g.vexnum; w++)//
修正當前最短路徑及距離
73 79}
80}81 cout << "
起始點:
"; //
一下就是輸出函式
82 cout << g.vexs[v0]<
83 cout << "
從開始點
"<< g.vexs[v0] << "
到各點的最短距離為:
"<
84for (int i = 0; i < g.vexnum; i++)
85 cout << "到"
<< g.vexs[i] << "
的距離為:
"<< dist[i] <
8788
intmain()
89
迪傑斯特拉最短路徑
問題描述 在帶權有向圖g中,給定乙個源點v,求從v到g中的其餘各頂點的最短路徑問題,叫做單源點的最短路徑問題。在常用的單源點最短路徑演算法中,迪傑斯特拉演算法是最為常用的一種,是一種按照路徑長度遞增的次序產生最短路徑的演算法。在本題中,讀入乙個有向圖的帶權鄰接矩陣 即陣列表示 建立有向圖並按照以上描...
最短路 (迪傑斯特拉)
a 最短路 crawling in process.crawling failed time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status practice hdu 2544 description 在...
最短路徑 迪傑斯特拉演算法
例如,要求下圖v0到v8的最短路徑 所以我們可以找到這樣的一條最短路徑 下面是他的鄰接矩陣 偽 如下 define maxvex 9 define infinity 65535 typedef int patharc maxvex 用於儲存最短路徑下標的陣列 typedef int shortpat...