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...