資料結構 迪傑斯特拉演算法求最短路徑

2021-10-08 06:03:13 字數 1875 閱讀 8483

問題描述

將圖以鄰接矩陣或鄰接表儲存,實現dijkstra演算法。

演算法設計

迪傑斯特拉演算法:

1.假設用帶權的鄰接矩陣arc,來表示帶權有向圖,arc[i][j],表示弧上的權值。若不存在,則置arc[i][j]為無窮。

s為已找到從v出發的最短路徑的終點的集合,它的初始狀態為空集。那麼,從v出發到圖上其餘各頂點可能達到的最短路徑長度的初值為:

d[j]=arcs[locatevex(g,v)][i] vi∈v

2.選擇vj,使得 d[j]=min

vj就是當前求得的一條從v出發的最短路徑的終點。令s=s∪

3.修改從v出發到集合v-s上任一頂點vk可達的最短路徑長度。如果

d[j]+arcs[j][k]4.重複操作2,3共n-1次。

由此求得從v到圖上其餘各頂點的最短路徑是依路徑長度遞增的序列。

**

#include

"stdio.h"

#include

"stdlib.h"

#define infinity int_max

#define max_vertex_num 20

#define infotype char

//儲存弧或者邊額外資訊的指標變數型別

#define vertextype char

//圖中頂點的資料型別

int p[max_vertex_num]

;//用於儲存最短路徑下標的陣列

int d[max_vertex_num]

;//用於儲存到各點最短路徑的權值

typedef

struct arccellarccell,adjmatrix[max_vertex_num]

[max_vertex_num]

;typedef

struct

mgraph;

intlocatevex

(mgraph *g,vertextype v)

if(i>=g->arcnum)

return-1

;else

return-1

;}void

creategraph

(mgraph *g)

for(

int i=

0;ivexnum;i++

)for

(int j=

0;jvexnum;j++

)printf

("輸入各個弧及權值:\n");

for(

int i=

0;iarcnum;i++

) g->arcs[n1]

[n2]

.adj=w;}}

//輸出鄰接矩陣

void

printgraph

(mgraph g)

printf

("\n");

}}void

dijkstra

(mgraph g,

int v0)

d[v0]=0

; final[v0]=1

;for

(v=1

;vfinal[k]=1

;for

(w=0

;w}}

void

print

(mgraph g,

int v)

else

if(d[i]

==int_max)}}

intmain()

結果

迪傑斯特拉演算法求最短路徑

include define infinity 10000 define true 1 define false 0 define vertex num 6 typedef struct graph graph void shortestpath graph g,int v0,int p verte...

最短路 (迪傑斯特拉)

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