基本思想:
設定頂點集合s並不斷地作貪心選擇來擴充這個集合。乙個頂點屬於集合s當且僅當從源到該頂點的最短路徑長度已知。
初始時,s中僅含有源。設u是g的某乙個頂點,把從源到u且中間只經過s中頂點的路稱為從源到u的特殊路徑,並用陣列dist記錄當前每個頂點所對應的最短特殊路徑長度。dijkstra演算法每次從v-s中取出具有最短特殊路長度的頂點u,將u新增到s中,同時對陣列dist作必要的修改。一旦s包含了所有v中頂點,dist就記錄了從源到所有其它頂點之間的最短路徑長度。
經典迪傑斯特拉演算法:
閱讀程式前,先要搞明白幾個陣列作用:
final[w]=1; 表示v0到vw頂點已經有最短路徑的結果
shortpathtable[w]; 表示v0到vw頂點的最短路徑權值和
pathmatirx[w]; 表示v0到vw頂點的前驅頂點下標值
個人總結
差異:普里姆演算法是尋找與已經過的點的最短路徑(已經經過的頂點與剩下的頂點的最短長度),而迪傑斯特拉演算法是尋找與初始頂點的最短路徑,因此迪傑斯特拉演算法每次尋找下乙個頂點時都會加上已走過路徑的長度,比如上地29行:
min+g.arc[k][w]
而普里姆演算法如下:
g.arc[k][j]g.arc[k][w]代表k頂點到剩下的點的長度,而lowcost[j] 是已走過的頂點到剩下頂點的長度。
演算法實現:
#include #include "seqlist.h"
#include "stack.h"
#include using namespace std;
#define infinity 65535
templateclass graph
~graph()
{}public:
int getver() const
istream & operator>>(istream &in)
/二維陣列的建立並初始化
edges = new disttype*[nver]; // disttype *ar[10];
for (i = 0; i < nver; ++i)
}cout << "請輸入邊的個數: " << endl;
in >> nedges;
cout << "請輸入邊的資訊:" << endl;
for (i = 0; i < nedges; ++i)
return in;
}ostream & operator<
out << endl;
out << "矩陣資訊:" << endl;
out << setw(10);
for (i = 1; i <= nver; ++i)
out << endl;
for (i = 0; i < nver; ++i)
out << endl;
}out << endl;
return out;
}// 迪傑斯特拉演算法實現
void shortestpath_dijkstra(int v0, int* final, int*p, int *d)
d[v0] = 0; // v0至v0路徑為0
final[v0] = 1; // final[w]=1表示v0至v0不需要求路徑
// 開始主迴圈,每次求得v0到某個v頂點的最短路徑
for (v = 1; v < nver; ++v)
}final[k] = 1; // 將目前找到的最近的頂點置為1
for (w = 0; w < nver; ++w) // 修正當前最短路徑距離}}
}};templateistream & operator>>(istream &in, graph&g)
templateostream & operator<
void main()
cout << endl;
cout << "列印最短路徑陣列值:" << " ";
for (int i = 0; i < numver; ++i)
cout << endl;
cout << "列印最短路徑前驅陣列值:" << " ";
for (int i = 0; i < numver; ++i)
cout << endl;
cout << "列印v0到各個頂點最短路徑值以及路徑資訊:" << endl;
seqstacksq;
for (int i = 1; i < numver; ++i)
while (!sq.isempty())
cout << "v" << i << endl;
}delete pfinal;
delete ppathmatirx;
delete pshortpath;
pfinal = null;
ppathmatirx = null;
pshortpath = null;
}// 備註:
// 最短路徑迪傑斯特拉演算法實現
// 整理於2013-12-04
// 測試輸入程式為:
/*請輸入頂點的個數:
9請輸入頂點的資料資訊:
a b c d e f g h i
請輸入邊的個數:
16請輸入邊的資訊:
0 1 1
0 2 5
1 2 3
1 3 7
1 4 5
2 4 1
2 5 7
3 4 2
3 6 3
4 5 3
4 6 6
4 7 9
5 7 5
6 7 2
6 8 7
7 8 4
列印所有輸入資訊:
頂點資訊
a b c d e f g h i
矩陣資訊:
a b c d e f g h i
a 0 1 5655356553565535655356553565535
b 1 0 3 7 565535655356553565535
c 5 3 065535 1 7655356553565535
d65535 765535 0 265535 36553565535
e65535 5 1 2 0 3 6 965535
f6553565535 765535 3 065535 565535
g655356553565535 3 665535 0 2 7
h65535655356553565535 9 5 2 0 4
i655356553565535655356553565535 7 4 0
求最短路徑.....
列印各頂點最短路徑標記陣列值: 1 1 1 1 1 1 1 1 1
列印最短路徑陣列值: 0 1 4 7 5 8 10 12 16
列印最短路徑前驅陣列值: 0 0 1 4 2 4 3 6 7
列印v0到各個頂點最短路徑值以及路徑資訊:
v0~v1: 1
v0->v1
v0~v2: 4
v0->v1->v2
v0~v3: 7
v0->v1->v2->v4->v3
v0~v4: 5
v0->v1->v2->v4
v0~v5: 8
v0->v1->v2->v4->v5
v0~v6: 10
v0->v1->v2->v4->v3->v6
v0~v7: 12
v0->v1->v2->v4->v3->v6->v7
v0~v8: 16
v0->v1->v2->v4->v3->v6->v7->v8
*/
最短路徑之迪傑斯特拉演算法
最短路徑之迪傑斯特拉演算法 設定頂點集合s並不斷地作貪心選擇來擴充這個集合。乙個頂點屬於集合s當且僅當從源到該頂點的最短路徑長度已知。初始時,s中僅含有源。設u是g的某乙個頂點,把從源到u且中間只經過s中頂點的路稱為從源到u的特殊路徑,並用陣列dist記錄當前每個頂點所對應的最短特殊路徑長度。dij...
最短路徑 迪傑斯特拉演算法
例如,要求下圖v0到v8的最短路徑 所以我們可以找到這樣的一條最短路徑 下面是他的鄰接矩陣 偽 如下 define maxvex 9 define infinity 65535 typedef int patharc maxvex 用於儲存最短路徑下標的陣列 typedef int shortpat...
迪傑斯特拉最短路徑演算法
時間限制 1 sec 記憶體限制 32 mb 提交 27 解決 17 提交 狀態 命題人 外部匯入 題目描述 在帶權有向圖g中,給定乙個源點v,求從v到g中的其餘各頂點的最短路徑問題,叫做單源點的最短路徑問題。在常用的單源點最短路徑演算法中,迪傑斯特拉演算法是最為常用的一種,是一種按照路徑長度遞增的...