演算法思想:每次找到離源點最近的頂點,然後以該頂點為中心進行擴充套件,最終得到源點到其餘所有點的最短路徑.時間複雜度是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 記錄當前點的前乙個結...