迪傑斯特拉演算法

2022-04-03 22:30:18 字數 1815 閱讀 1384

dijkstra(迪傑斯特拉)演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法

能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。

dijkstra演算法是很有代表性的最短路演算法,在很多專業課程中都作為基本內容有詳細的介紹,如資料結構,圖論,運籌學等等。

其基本思想是,設定頂點集合s並不斷地作貪心選擇來擴充這個集合。乙個頂點屬於集合s當且僅當從源到該頂點的最短路徑長度已知。

初始時,s中僅含有源。設u是g的某乙個頂點,把從源到u且中間只經過s中頂點的路稱為從源到u的特殊路徑,並用陣列dist記錄當前每個頂點所對應的最短特殊路徑長度。dijkstra演算法每次從v-s中取出具有最短特殊路長度的頂點u,將u新增到s中,同時對陣列dist作必要的修改。一旦s包含了所有v中頂點,dist就記錄了從源到所有其它頂點之間的最短路徑長度。

例如,對下圖中的有向圖,應用dijkstra演算法

計算從源頂點1到其它頂點間最短路徑的過程列在下表中。

dijkstra演算法的迭代過程:

主題好好理解上圖!

以下是具體的實現(c/c++):

/*************************************** * about:    有向圖的dijkstra演算法實現 * author:   tanky woo * blog:     www.wutianqi.com **************************************

*/#include

#include

using namespace std;

const int maxnum = 100;

const int maxint = 999999;

void dijkstra(int n, int v, int *dist, int *prev, int c[maxnum][maxnum])

dist[v] = 0;

s[v] = 1;

// 依次將未放入s集合的結點中,取dist最小值的結點,放入結合s中

// 一旦s包含了所有v中頂點,dist就記錄了從源點到所有其他頂點之間的最短路徑長度

for(i=2; i<=n; ++i)

int main()

}for(i=1; i<=n; ++i)

dist[i] = maxint;

for(i=1; i<=n; ++i)

dijkstra(n, 1, dist, prev, c);

// 最短路徑長度

cout << "源點到最後乙個頂點的最短路徑長度: " << dist[n] << endl;

// 路徑

cout << "源點到最後乙個頂點的路徑為: ";

searchpath(prev, 1, n);

return 0;

} /*

輸入資料:57

1 2 10

1 4 30

1 5 100

2 3 50

3 5 10

4 3 20

4 5 60

輸出資料:

999999 10 999999 30 100

10 999999 50 999999 999999

999999 50 999999 20 10

30 999999 20 999999 60

100 999999 10 60 999999

源點到最後乙個頂點的最短路徑長度: 60

源點到最後乙個頂點的路徑為: 1 -> 4 -> 3 -> 5

*/

迪傑斯特拉演算法

if object id t test is not null drop table t test gocreate table dbo t test id int identity 1,1 not null primary key,自增字段,無意義 header varchar 500 第一點的名...

迪傑斯特拉演算法

dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法 能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。dijkstra演算法是很有代表性的最短...

迪傑斯特拉演算法

迪傑斯特拉演算法用來計算圖中某一點到其他點的最短距離,這個圖可以是加權,也可以是無權的,距離指的是從一點到其它點所經過的邊的權重和 假設現在有乙個加權無向圖,我們要求節點1到其他點的最短距離 初始化圖arr 用乙個鄰接矩陣來表示一張圖,矩陣元素 初始化一維向量d,這個向量儲存的是其他點的最短距離,初...