Dijkstra演算法 通過邊實現鬆弛

2022-09-23 23:33:13 字數 1004 閱讀 2200

演算法思想:每次找到離源點最近的頂點,然後以該頂點為中心進行擴充套件,最終得到源點到其餘所有點的最短路徑.時間複雜度是o(n^2).

基本步驟:

將所有的頂點分為兩部分,已知最短路程的頂點集合s和未知最短路徑的頂點集合v. 最開始,已知最短路徑在集合s中只有源點乙個頂點,用book陣列來標記哪些點在集合s中.設定源點p到自己的最短路徑為0(即dis[p] = 0). 若存在有源點能直接到達的頂點i,則把dis[i] 設為 e[p][i]. 同時把所有其他(源點不能直接到達的)頂點的最短路徑設為∞.在集合v的所有頂點中選擇乙個離源點p最近的頂點u(即dis[u]最小)加入到集合p中. 並考察所有以點u為起點的邊,對每一條邊進行鬆弛操作.重複第3步,如果集合v為空,則結束,最終得到的dis陣列中的值就是源點到所有頂點的最短路徑.

乙個點到其餘各個頂點的最短路徑也叫做「單源最短路徑」. 這個dijkstra同樣求最短路徑的圖同樣不能有負權邊,因為擴充套件到負權邊的時候會產生更短的路徑,有可能破壞了已經更新的點路徑不會改變的性質.

code:

#include

#include

#include

#define inf 999999

int book[10]; /// 用來紀錄已經是最短路徑的點

int main(int argc, char const *ar**)

else

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

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

book[1] = 1; /// dijkstra 演算法核心

for(i = 1; i < n; ++i) /// 計算n-1次

}book[u] = 1;

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

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

printf("\n");

system("pause");

return 0;

}

Dijkstra 演算法 通過邊實現鬆弛

乙個點 源點 到其餘哥哥頂點的最短路徑 單元最短路徑。演算法步驟如下 1。將所有的頂點分為兩部分 已知最短路程的頂點集合p和未知最短路徑的集合頂點集合q。最開始,已知最短路徑的頂點集合p只有源點乙個頂點,我們這裡可以用乙個book陣列來記錄哪些頂點在集合p中哪些頂點在集合q中。book i 1,表示...

6 2Dijkstra演算法 通過邊實現鬆弛

includeusing namespace std int main else e i j inf 讀入邊 cout 請依次輸入m條邊,每條邊起點為b1,終點為b2,權重為z3。即b1 b2 z3 b1 b2 z3 e b1 b2 z3 初始化dis陣列,這裡是1號頂點到其餘各個頂點的初始路程 f...

dijkstra演算法實現

include include using namespace std const int maxnum 100 const int maxint 999999 各陣列都從下標1開始 int dist maxnum 表示當前點到源點的最短路徑長度 int prev maxnum 記錄當前點的前乙個結...