最短路徑演算法 Dijkstra 迪傑斯特拉

2021-08-04 02:57:13 字數 1740 閱讀 8098

dijkstra演算法

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

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

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

例如,對下圖中的有向圖,應用dijkstra演算法計算從源頂點1到其它頂點間最短路徑的過程列在下表中。

主題好好理解上圖!

/***************************************

* about: 有向圖的dijkstra演算法實現

* author: tanky woo

* blog: www.wutianqi.com

***************************************/

#include using namespace std;

const int maxnum = 100;

const int maxint = 999999;

// 各陣列都從下標1開始

int dist[maxnum]; // 表示當前點到源點的最短路徑長度

int prev[maxnum]; // 記錄當前點的前乙個結點

int c[maxnum][maxnum]; // 記錄圖的兩點間路徑長度

int n, line; // 圖的結點數和路徑數

// n -- n nodes

// v -- the source node

// dist -- the distance from the ith node to the source node

// prev -- the previous node of the ith node

// c -- every two nodes' distance

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(int i=2; i<=n; ++i)

int main() }

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

dist[i] = maxint;

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

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

// 最短路徑長度

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

// 路徑

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

searchpath(prev, 1, n);

}

迪克特斯拉 Dijkstra 最短路徑演算法

在進行三維管線連通性分析時,需要運用到最短路徑演算法,主要思路為首先初始化圖,然後將查詢到的管點以及管線分別作為圖的頂點數以及邊數。export default clear function this.pathmatirx this.shortpathtable 初始化圖 init function...

最短路徑演算法Dijkstra演算法(迪傑斯特拉演算法)

網路 dist i 表示當前找到的v0到i的最短距離 path i 表示v0到i i的前一節點 void dij mgraph g,int dist,int path,int v0 else visted v0 true dist v0 0 path v0 v0 for i 1 i 在當前距離記錄中...

Dijkstra最短路徑演算法

基本思路是 選擇出發點相鄰的所有節點中,權最小的乙個,將它的路徑設定為確定。其他節點的路徑需要儲存起來。然後從剛剛確認的那個節點的相鄰節點,算得那些節點的路徑長。然後從所有未確定的節點中選擇乙個路徑最短的設定為確定。重複上面步驟即可。void dijkstra graph g,string v fl...