dijkstra(迪傑斯特拉
)演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。
dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。
dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的介紹,比如資料結構、圖論、運籌學等。
1、演算法思想
令g = (v,e)為乙個帶權有向圖,
把圖中的頂點集合v分成兩組,第一組為已求出最短路徑的頂點集合s(初始時s中只有源節點,以後每求得一條最短路徑,就將它對應的頂點加入到集合s中,直到全部頂點都加入到s中
);第二組是未確定最短路徑的頂點集合u。在加入過程中,總保持從源節點v到s中各頂點的最短路徑長度不大於從源節點v到u中任何頂點的最短路徑長度。
2、
演算法步驟
(1)初始化時,s只含有源節點;
(2)從u中選取乙個距離v最小的頂點k加入s中(該選定的距離就是v到k的最短路徑長度
);(3)以k為新考慮的中間點,修改u中各頂點的距離;若從源節點v到頂點u的距離(經過頂點k
)比原來距離(不經過頂點k
)短,則修改頂點u的距離值,修改後的距離值是頂點k的距離加上k到u的距離;
(4)重複步驟(2)和(3),直到所有頂點都包含在s中。
具體圖例與演算法執行步驟:(就從a開始,到各節點的最短路徑
具體執行步驟如下圖所示。
ps:右下角是原作者的部落格位址。
3、演算法具體實現
演算法的具體實現如下所示。
#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"
#define ok 1
#define error 0
#define true 1
#define false 0
#define maxedge 20
#define maxvex 20
#define infinity 65535
typedef int status;
/* status是函式的型別,其值是函式結果狀態**,如ok等 *
/typedef struct
mgraph;
typedef int patharc[maxvex];/
* 用於儲存最短路徑下標的陣列 *
/typedef int shortpathtable[maxvex];/
* 用於儲存到各點最短路徑的權值和 *
/void createmgraph(mgraph *g)
for(i = 0; i < g-
>numvertexes; i++)
/* 初始化圖 */}
g->arc[0]
[1]=1;
g->arc[0]
[2]=5;
g->arc[1]
[2]=3;
g->arc[1]
[3]=7;
g->arc[1]
[4]=5;
g->arc[2]
[4]=1;
g->arc[2]
[5]=7;
g->arc[3]
[4]=2;
g->arc[3]
[6]=3;
g->arc[4]
[5]=3;
g->arc[4]
[6]=6;
g->arc[4]
[7]=9;
g->arc[5]
[7]=5;
g->arc[6]
[7]=2;
g->arc[6]
[8]=7;
g->arc[7]
[8]=4;
for(i = 0; i < g-
>numvertexes; i++)
}}/* dijkstra演算法,求有向網g的v0頂點到其餘頂點v的最短路徑p[v]及帶權長度d[v]*/
/* p[v]的值為前驅頂點下標,d[v]表示v0到v的最短路徑長度和 *
/void shortestpath_dijkstra(mgraph g,
int v0, patharc *p, shortpathtable *d)
(*d)
[v0]
= 0;
/* v0至v0路徑為0 *
/final[v0]
= 1;
/* v0至v0不需要求路徑 *//
* 開始主迴圈,每次求得v0到某個v頂點的最短路徑 *
/for
(v=1; v
}final[k]
= 1;
/* 將目前找到的最近的頂點置為1 *//
* 修正當前最短路徑及距離 *
/for
(w=0; w
}}}int main(void)
printf(
"\n");
}printf(
"\n源點到各頂點的最短路徑長度為:\n");
for(i=1;i
++i)
printf(
"v%d - v%d : %d \n"
,g.vexs[0]
,g.vexs[i]
,d[i]);
return 0;}
資料結構之最短路徑(Floyd)
floyd演算法,求網圖g中各頂點v到其餘頂點w的最短路徑p v w 及帶權長度d v w void shortestpath floyd mgraph g,patharc p,shortpathtable d 下面介紹下詳細的執行過程 1 程式開始執行,第4 11行就是初始化了d和p,使得它們成為...
資料結構之最短路徑問題
1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的介紹,如資料結構,圖論,...
演算法和資料結構之最短路徑演算法
references 通常,我們發現沿著圖中的一條邊移動會有一些相關的成本 或利潤 例如邊的距離,汽油的 花費的時間等等。我們稱這之為加權圖,稱邊值為權值。我們將之前的圖定義擴充套件如下 加權圖g由有序序列 v,e,w 組成,其中v和e是頂點和邊,w是邊的權值。w a,b 50,w a,c 30等等...