前置知識
我的淺顯理解
對於乙個圖,首先源點加入乙個集合(點的集合)裡,然後去找和已知點集相連邊權最小的點,將該點加入點集,更新源點到各點的最短距離,重複以上操作,直到擴充套件結束!
例子下面以乙個比較簡單的有向帶權圖為例 (就是嚴版資料結構第二版裡的例題)
一維陣列s,記錄是否已找到源點到相應點的最短路徑
二維陣列path,記錄最短路徑
一維陣列d,記錄最短路徑的總邊權
具體實現**
#include
#include
#include
#include
using
namespace std;
int max;
//最大值
int node_num;
//點數
int len_num;
//邊數
bool s[
100]=;
//是否已加入已選點集,即是否已找到源點到相應點的最短路徑
int d[
100]
;//源點到相應點的最短路徑權值
vector
int>
>
path
(100);
int g[
100]
[100];
//鄰接表
void
dijkstra
(int v0)
d[v0]=0
;//v0到v0的距離為0
s[v0]=1
;//將源點加入點集
int pos=0;
for(
int i =
1; i < node_num; i++)}
s[pos]=1
;for
(int j =
0; j < node_num; j++)}
}}intmain()
int v0;
cout <<
"輸入源點:"
; cin >> v0;
dijkstra
(v0)
;for
(int i =
0; i < node_num; i++)if
(d[i]
== max) cout <<
"不連通"
<< endl;
else cout <<
" 總邊權:"
<< d[i]
<< endl;
}return0;
}/*6 80 2 10
0 4 30
0 5 100
1 2 5
2 3 50
4 3 20
4 5 60
3 5 10
*/
ps:希望對你有幫助! Bellman Ford演算法求最短路
圖論中比較基礎的問題,求單源最短路,即在圖中找乙個點作為起點,求他到其他點的最短路,而bellman ford演算法是其中最簡單的演算法,相應地,其複雜度也比較高,效率也比較低,但是,他卻可以判斷圖中是否存在負權迴路 走一圈經過的權值是負數 因此可以處理帶有負權邊的圖,且該演算法是其他各種最短路演算...
dijkstra演算法求最短路
演算法思想 用乙個dis陣列記錄源點到其他各點的路徑,例如 如果v0是源點,那麼dis 1 就表示v0到v1的最短距離 用乙個vis陣列記錄頂點有沒有被當成出發點。如果第乙個出發點 源點 到別的點的路都已經走完了,那就找一下個目前距離源點最近的點作為出發點,標誌為1。然後繼續尋找最短路徑,如果dis...
Floyd演算法(求最短路)
百科名片 弗洛伊德演算法 floyd演算法又稱為弗洛伊德演算法,插點法,是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。該演算法名稱以創始人之一 1978年圖靈獎獲得者 史丹福大學電腦科學系教授羅伯特 弗洛伊德命名。通過乙個圖的權值矩陣求出它的每兩點間的最短路徑 矩陣。從圖的帶權鄰接矩陣a a ...