按路徑長度遞增的次序產生最短路徑的算法。
大致思路:
求兩頂點之間的最短路徑,先一步步求出兩點之間頂點的最短路徑,基于已求出的最短路徑的基礎上,求得更遠頂點的最短路徑,最終得到結果。
Code:
#define MAXVEX 100
#define INFINITY 65535
typedef int Patharc[MAXVEX]; //用于存儲最短路徑下標的數組,其值代表結點前驅下標
typedef int ShortPathTable[MAXVEX]; //用于存儲到各點最短路徑的權值和
/*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)
{
????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]; //將與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; //當前所知離v0頂點的最近距離
????????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[k] && (min + G.arc[k][w]) < (*D)[w])
????????????{//說明找到了更短的路徑,修改D[w]和P[w]
????????????????(*D)[w] = min + G.arc[k][w]; //修改當前路徑長度
????????????????(*P)[w] = k;
????????????}
????????}
????}
}
時間復雜度:O(n^2)