最短路徑 Dijkstra算法

//風雨難洗心痕,滄桑不滅情傷。莫要輕言亙古,離散纔看荒涼。




typedef char Vertextype;  //頂點
typedef int EdgeType;  //邊的權值
typedef int Patharc[MAXVEX];//用於存儲最短路徑下標的數組
typedef int ShortPathTable[MAXVEX];//用於存儲到各點最短路徑的權值和
#define MAXVEX 9
#define INFINITY 65535


//鄰接矩陣
typedef struct
{
Vertextype vexs[MAXVEX];  //頂點表
EdgeType arc[MAXVEX][MAXVEX];//鄰接矩陣,可以看做邊表
int numvertexes, numEdges;  //當前的頂點和邊數
}MGraph;


//求有向網G的v0頂點到其餘頂點v最短路徑p[v]及帶權長度D[v],p[v]的值爲前驅頂點下標,D[v]表示v0到v的最短長度和
void ShortestPath_Dijkstra(MGraph G, int v0, Patharc *p, ShortPathTable *D)
{
int v, w, k, min;
int final[MAXVEX];//final[w]=1表示求得頂點v0至vw的最短路徑
for ( v = 0; v < G.numvertexes; v++)
{
final[v] = 0;
(*D)[v] = G.arc[v0][v];
(*p)[v]=0
}
(*D)[v0] = 0;//v0到v0的路徑爲0
final[v0] = 1;//v0到v0不需要求路徑


//開始主循環,每次求得v0到某個v頂點的最短路徑
for ( v = 1; v < G.numvertexes; v++)
{
min = INFINITY;
for ( w = 0; w < G.numvertexes; w++)//找離v0最近的頂點
{
if (!final[w] && (*D)[w] < min)
{
k = w;
min = (*D)[w];//w頂點離v0頂點最近
}
}
final[k] = 1;//將目前找到的最近的頂點置爲1
for ( w = 0; w < G.numvertexes; w++)//修正當前最短路徑和距離
{
//如果經過v頂點的路徑比現在這條路路徑的長度短的話
if (!final[w] && (min + G.arc[k][w] < (*D)[w]))
{
//說明找到了更短的路徑,修改D[w]和p[w]
(*D)[w] = min + G.arc[k][w];//修改當前路徑長度
(*p)[w] = k; 
}
}
}
}
發佈了29 篇原創文章 · 獲贊 9 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章