最短路徑之Dijkstra演算法

2021-10-01 05:08:22 字數 1304 閱讀 5447

給定有向網圖g=(v,e)和源點v∈v,求從v到g中其餘各項點的最短路徑。

基本思想:將頂點集合v分成兩個集合,一類是生長點的集合s,包括源點和已經確定的最短路徑的頂點,另一類是非生長點的集合v-s,包括所有尚未確定最短路徑的頂點,並使用乙個待定路徑表,儲存從當前源點v到每個非生長點v的最短路徑。初始時,s只包含源點v,對vi∈v-s,待定路徑表為從源點v到vi的有向邊。然後在待定路徑表中找到當前最短路徑v……vk,將vk加入集合s中,對vi∈v-s,將路徑v……vk vi與待定路徑表中從源點v到vi的最短路徑相比較,取路徑長度較小者為當前最短路徑。重複上述過程,直到集合v中全部頂點加入到集合s中。

時間複雜度:o(n^2)

**:

#include using namespace std;

const int maxsize = 10; //圖中最多頂點個數

template

class mgraph

; //析構函式

void dijkstra(int v);

private:

int min(int r[ ], int n);

datatype vertex[maxsize]; //存放圖中頂點的陣列

int edge[maxsize][maxsize]; //存放圖中邊的陣列

int vertexnum, edgenum; //圖的頂點數和邊數

};template

mgraph :: mgraph(datatype a[ ], int n, int e)

}template

void mgraph :: dijkstra(int v) //從源點v出發

for (num = 1; num < vertexnum; num++)

dist[k] = 0; //將頂點k加到集合s中}}

template

int mgraph ::min(int r[ ], int n)

return index;

}int main( )

; /* 測試資料使用 圖6-20(b),輸入邊七條邊是:

(0 1 10)(0 4 100)(0 3 30)(1 2 50)(2 4 10)(3 2 20)(3 4 60) */

mgraph mg; //建立具有5個頂點6條邊的無向圖

mg.dijkstra(0);

return 0;

}

最短路徑 之Dijkstra演算法

dijkstra演算法dijkstra 鄰接矩陣 int n,e maxv maxv int dis maxv pre maxv pre用來標註當前結點的前乙個結點 bool vis maxv void dijkstra int s if u 1 return visit u true for in...

最短路徑 之Dijkstra演算法

dijkstra演算法 dijkstra 鄰接矩陣 int n,e maxv maxv int dis maxv pre maxv pre用來標註當前結點的前乙個結點 bool vis maxv void dijkstra int s if u 1 return visit u true for i...

最短路徑之Dijkstra演算法

using system namespace dijkstra演算法 路徑圖 static int places int math.sqrt map.length 獲取地點數 static int shortest new int places 存放從start到其他節點的最短路徑 static b...