迪傑斯特演算法的核心是首先正向把離起點最近的點乙個乙個找出來,然後從終點開始逆向計算最短路徑
利用圖資料結構實現dijkstra演算法的偽**如下
建立乙個陣列f記錄頂點是否已經計算離頂點最近的距離
建立乙個儲存路徑的陣列p
迴圈頂點個數的次數
將於k有連線的頂點w在距離d中的值更新,如果通過頂點k,距離d中的值變小就更新,p[w]
=k }
迴圈結束,最短路徑距離在d中,路徑在p中
#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
shortestpth_dijkstra
(mgraph g,
int v0, patharc* p, shortpathtable* d)
(*d)
[v0]=0
;/* v0至v0路徑為0 */
final[v0]=1
;/* v0至v0不需要求路徑 */
/* 開始主迴圈,每次求得v0到某個v頂點的最短路徑 ,並且更新之前的距離*/
for(
int v =
1; v < g.numvertexes; v++)}
final[k]=1
;/* 將目前找到的最近的頂點置為1 ,表示已經計算了距離*/
//因為新找到了點,對之前所有確定距離的點更新距離
for(
int w =
0; w < g.numvertexes; w++)}
}}intmain
(void
)printf
("\n");
}printf
("\n源點到各頂點的最短路徑長度為:\n");
for(i =
1; i < g.numvertexes;
++i)
printf
("v%d - v%d : %d \n"
, g.vexs[0]
, g.vexs[i]
, d[i]);
return0;
}
floyd演算法
演算法的核心操作和dijkstra演算法類似,都是先建立乙個距離矩陣d和路徑矩陣p,然後不斷更新兩個矩陣。
#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]
[maxvex]
;typedef
int shortpathtable[maxvex]
[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++)}
}/* floyd演算法,求網圖g中各頂點v到其餘頂點w的最短路徑p[v][w]及帶權長度d[v][w] */
void
shortestpath_floyd
(mgraph g, patharc* p, shortpathtable* d)
}for
(int k =
0; k < g.numvertexes;
++k)}}
}}intmain
(void
)printf
(" -> %d\n"
, w)
;/* 列印終點 */
}printf
("\n");
}printf
("最短路徑d\n");
for(v =
0; v < g.numvertexes;
++v)
printf
("\n");
}printf
("最短路徑p\n");
for(v =
0; v < g.numvertexes;
++v)
printf
("\n");
}return0;
}
資料結構 最短路徑 Dijkstra演算法
最短路徑 dijkstra演算法 設計實現有向網,針對隨機有向網例項和隨機源點,用dijkstra演算法求解出單源點到其他各頂點的最短路徑。給出求解過程的動態演示。可考慮實現不用儲存結構上的實現。如下圖所示,若要建立乙個這樣的圖,且源點為1時,則輸入順序為 include include defin...
資料結構和演算法 最短路徑
dijstra 演算法 void shortestpath dij mgraph g,int v0,bool path maxvertexnum maxvertexnum int pathlen pathlen v0 0 final v0 true 將 v0加 頂點集合 s 開始主迴圈,每次求得 v...
資料結構 最短路徑演算法之Floyed演算法
floyed warshall 演算法用來找出每對點之間的最短距離。它需要用鄰接矩陣來儲存邊,這個演算法通過考慮最佳子路徑來得到最佳路徑。注意單獨一條邊的路徑也不一定是最佳路徑。時間複雜度o n 3 只要有存下鄰接矩陣的空間,時間一般沒問題,並且不必擔心負權邊的問題。include include ...