07最短路徑 Dijkstra

2021-10-10 01:50:22 字數 1911 閱讀 6778

#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。帶權圖中,從乙個結點到另個一結點存在著多條路徑,稱每一條路...