從源點到終點的路徑可能存在三種情況:1. 沒有路徑 2. 只有一條路徑 3. 有多條路徑
思路:按照路徑長度遞增的次序從源點到終點的路徑。
假設gra思路:copy自這個部落格ph[]
[]
graph
graph[
][]為有向網的鄰接矩陣,s
ss為已找到最短路徑結點的集合,其初始狀態為只含乙個頂點,即源點。另設乙個一維陣列dis
t[n]
dist[n]
dist[n
],其中每個分量表示當前所找到的從源點出發(經過集合s中的頂點)到各個終點的最短路徑長度。顯然,dis
tdist
dist
的初值為:
d is
t[k]
=gra
ph[i
][k]
dist[k] = graph[i][k]
dist[k
]=gr
aph[
i][k
]1選擇u
uu,使得
d is
t[u]
=min
dist[u] = min\
dist[u
]=minuu
u為目前找到的從源點出發的最短路徑的結點。將這些結點u
uu併入集合sss。
修改d is
tdist
dist
陣列中所有尚未找到最終路徑的結點的對應分量值。如果gra
ph[u
][w]
graph[u][w]
graph[
u][w
]為有限值,即從頂點u
uu到頂點w
ww有弧存在,並且
d is
t[u]
+gra
ph[u
][w]
st[w
]dist[u]+graph[u][w] < dist[w]
dist[u
]+gr
aph[
u][w
]st[w
]則令:
d is
t[w]
=dis
t[u]
+gra
ph[u
][w]
dist[w] = dist[u] + graph[u][w]
dist[w
]=di
st[u
]+gr
aph[
u][w
]重複上述(2)和(3)的操作n-1次,即可求得從源點到所有終點的最短路徑。
#include
#include
using
namespace std;
void
dijkstra
(int n,
int s,
const vectorint>
>
&g, vector<
int>
&prev)
else
} s[s]
=true
; dist[s]=0
;// find next path for the shortest path
int u;
// next
int value = int_max;
for(
int i =
0; i < n; i++)}
// update
for(
int i =
0; i < n; i++)}
}}void
searchpath
(const vector<
int>
& prev,
int s,
int e)
rpath.
push_back
(s);
for(
auto it = rpath.
rbegin()
; it != rpath.
rend()
;it++)}
intmain()
dijkstra
(n, st, g, prev)
;int t;
cin >> t;
while
(t--
)}
i
ii為源點在途中的序號 ↩︎
最短路 求最長最短路,求最短路的路徑
hdu 1595 find the longest of the shortest include include include include include include include include include include include include include defi...
求最短路徑(dijkstra)
因為要做一道題牽扯到最小路徑的演算法,所以就看了看締結斯特拉演算法。看了演算法導論上面的介紹不明白,只好下了乙個 自己去看。單源圖最短路徑求法 int dijkstra int from,int to int map n s u 1 for i 0 i 看了之後自己總結的一點點的經驗 締結斯特拉演算...
Dijkstra求最短路徑
把m1.txt與可執行檔案放在統一路徑下 m1.txt 距離矩陣,9行9列 的資料如下 9999 6 3 1 9999 9999 9999 9999 9999 9999 9999 9999 9999 1 9999 9999 9999 9999 9999 2 9999 2 9999 9999 9999...