資料結構之最短路徑(DijKstra)

2021-07-23 15:06:15 字數 2885 閱讀 9993

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等等...