資料結構 單源最短路徑 Dijkstra演算法

2022-07-19 02:45:14 字數 2417 閱讀 3919

dijkstra演算法

給定一帶權圖,圖中每條邊的權值是非負的,代表著兩頂點之間的距離。指定圖中的一頂點為源點,找出源點到其它頂點的最短路徑和其長度的問題,即是單源最短路徑問題。

dijkstra演算法

求解單源最短路徑問題的常用方法是dijkstra(迪傑斯特拉)演算法。該演算法使用的是貪心策略:每次都找出剩餘頂點中與源點距離最近的乙個頂點。

帶權圖g=,令s為已確定了最短路徑頂點的集合,則可用v-s表示剩餘未確定最短路徑頂點的集合。假設v0是源點,則初始 s=。用陣列distance表示源點v0到其餘頂點的路徑長度,用陣列pre[i]表示最短路徑序列上頂點i的前乙個頂點。初始時,pre[i]都是源點的下標。接下來需重複兩個步驟:

從當前distance[i]找出最小的乙個,記錄其下標v=i,源點v0到頂點vv的最短路徑即已確定,把vv加入s。

更新源點到剩餘頂點的最短路徑長度。更新方法是:以上一步的頂點vv為中間點,若distance[v]+weight(v,i)

重複以上兩個步驟,直至所有頂點的最短路徑都已找到。

需要指出,dijkstra演算法求解的不僅是有向圖,無向圖也是可以的。下面給出乙個完整的有向帶權圖的例項:

有向帶權圖

dijkstra演算法的求解過程

其中,inf是infinity無窮大的意思。

類定義

#include#include#includeusing namespace std;  

#define maxweight 100  

#ifdef infinity  

#undef infinity  

#endif  

#define infinity 1000  

class graph  

;

類實現

//建構函式,指定頂點數目  

graph::graph(int numv)  

this->numv = numv;  

//構建鄰接矩陣,並初始化  

matrix = new int*[numv];  

int i, j;  

for (i = 0; i 

matrix[i] = new int[numv];  

for (i = 0; i 

for (j = 0; j 

}  void graph::creategraph(int nume)  

this->nume = nume;  

int tail, head, weight, i;  

i = 0;  

cout <

while (i 

matrix[tail][head] = weight;  

i++;  

}  }  graph::~graph()  

/* 迪傑斯特拉演算法 

求指定頂點vertex到其它頂點的最短路徑 

不僅要得出最短路徑長度,也要得到其序列 

*/  

void graph::dijkstra(int vertex)  

}  find[v] = true;  

//更新剩餘頂點的前驅和最短距離  

for (i = 0; i 

}  }  

count++;  

}  //列印最短路徑序列和其長度  

stacks;  

for (i = 0; i 

while (v!=vertex);  

//列印最短路徑序列  

while (!s.empty())  

cout <

}  }  

cout <

deletefind;  

deletepre;  

deletedistance;  

}  //列印鄰接矩陣    

void graph::printadjacentmatrix()  

}  bool graph::check(int tail, int head, int weight)  

主函式

int main()  

執行

若有所幫助,頂乙個哦!

單源最短路徑

include define max 999 define maxverts 10 typedef struct graph void chushi graph g void dij graph int key,int int int main for i 1 i g.numverts i dij ...

單源最短路徑

最優子結構 最短路徑的子路徑也是最短路徑,動態規劃和貪心演算法的乙個重要指標。環路 一條最短路徑不可能包含環路 1 環路權重為負,如果有一條環路權重為負,則不存在最短路徑 2 環路權重為零,如果包含該環路,則將該環路去掉即可 3 環路權重為正,去掉改環路可以得到更短的路徑,因此不可能是最短路徑 最短...

單源最短路徑

單源最短路徑問題,即在圖中求出給定頂點到其他任一頂點的最短路徑。1.最短路徑的最優子結構性質 該性質描述為 如果p i,j 是從頂點i到j的最短路徑,k和s是這條路徑上的乙個中間頂點,那麼p k,s 必定是從k到s的最短路徑。證明 假設p i,j 是從頂點i到j的最短路徑,則有p i,j p i,k...