問題描述
將圖以鄰接矩陣或鄰接表儲存,實現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...