#include
#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]);
return0;
}
Dijkstra 最短路徑
dijkstra 最短路徑 針對有向圖,不支援負權值 圖的相鄰矩陣表示方法,還要用到最小值堆 include include define unvisited 0 define visited 1 define infinite 9999 設定最大值 define n 5 定義圖的頂點數 using...
dijkstra最短路徑
hehe和xixi在乙個地方玩遊戲,xixi把n 1件禮物 hehe以前送給xixi的 分別藏在了另外n 1個地方,這些地方都能互相到達,且所有的邊都是有方向的。現在hehe要做的事就是去那些地方找回那n 1件禮物給xixi 由於每一件禮物都有特殊的意義,所以xixi要求hehe每找到一件禮物,就必...
最短路徑 Dijkstra
首先,提出兩點 一 如果把不帶權圖上的所有邊的權值均定義為1,則該不帶權圖可以歸結為帶權圖 二 如果把無向圖中的每一條邊 vi,vj 都定義為弧和弧,則該無向圖可以歸結為有向圖。因此不失一般性,我們只用看有向帶權圖怎麼求解最短路徑問題就ok。帶權圖中,從乙個結點到另個一結點存在著多條路徑,稱每一條路...