1. 程式人生 > >最短路徑算法之Dijkstra算法

最短路徑算法之Dijkstra算法

最終 ID max htable tab 過程 ini a算法 主循環

參考:《大話數據結構》

這是一個按照路徑長度遞增的次序產生最短路徑的算法。它並不是一次求出源點到目標點的最短路徑,而是一步步求出它們之間頂點的最短路徑,過程中都是基於已經求出的最短路徑的基礎上,求得更遠頂點的最短路徑,最終得到想要的結果。

#define MAXVEX 9
#define INFINITY 
typedef int PathMatrix[MAXVEX]
typedef int ShortPathTable[MAXVEX]

void ShortestPath_Dijkstra(MGraph G, int v0, PathMatrix *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.matrix[v0][v]; //將與v0點有連線的頂點加上權值 (*p)[v] = 0; //初始化路徑數組p為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]; } } } final[k] = 1; //將目前找到的最近的頂點置為1
for(w=0;w<G.numVertexes;w++) { if(!final[w] && (min + G.matrix[k][w])<(*D)[w]) //如果警告v頂點的路徑比現在這條路徑的長度短的話 { (*D)[w] = min + G.matrix[k][w]; (*p)[w] = k; } } }

最短路徑算法之Dijkstra算法