次短路有兩種計算方法。
對於一條端點為u、v的邊,點v的次短路,要麼是點u的次短路加邊權,要麼是點u的最短路加邊權。
設兩個陣列,dist1儲存最短路,dist2儲存次短路,則存在下面的等式:
d is
t2[v
]=mi
ndist2[u]+w \\ dist1[u]+w&& \\ \end \right.
dist2[
v]=m
in}if
(dist2[v]
>dist2[u]
+w)}
if(dist2[v]
>dist[u]
+w && dist[u]
+w>dist[v])}
}}}對於無向圖,先從1跑一遍最短路,儲存在dist1,再從n跑一遍最短路,儲存在dist2,對於每一條邊,計算dist1[u]+dist2[v]+w,從裡面找出次短路。
等式如下:
a ns
=min(
ans,
dist
1[u]
+dis
t2[v
]+w)
滿足:(dist1[u]+dist2[v]+w)>dist1[n]
ans=\min(ans,dist1[u]+dist2[v]+w) \text
ans=
min(an
s,di
st1[
u]+d
ist2
[v]+
w)滿足:(dist1[u]+dist2[v]+w)>dist1[n]
圖的儲存
//建圖
typedef pair<
int,
int> p;
vectorg[n]
;for
(int i=
1,x,y,z;i<=m;i++
)
跑完最短路後,求次短路。
//dist1和dist2分別是起點為1和n的最短路徑
int ans=
0x3fffffff
;for
(int i=
1;i<=n;i++
)for
(int j=
0;j.size()
;j++
)
最短路小結
通過對最短路的學習,我已經部分掌握了3大演算法及其變形,會用一些知識去解決問題,但學無止境,仍有許多知識我知之甚少,我希望通過我的努力會變得越來越強。floyd經典演算法適合多源最短路,由於複雜度較高,適合資料較小的題目,但也有些題目可由floyd的變形去做。dijkstra演算法為單源最短路,主要...
最短路問題 小結
分類 小結 2014 06 06 14 57 93人閱讀收藏 舉報最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖 由結點和路徑組成的 中兩結點之間的最短路徑。演算法具體的形式包括 確定起點的最短路徑問題 即已知起始結點,求最短路徑的問題。確定終點的最短路徑問題 與確定起點的問題相反,該問題...
最短路演算法小結
dijkstra演算法 適用於 無負權邊,無環 視所求得 最短 定義而論 的圖的單源最短路問題 也就是考慮乙個點 常用 dist i 陣列儲存源點 到 i 點的距離,應用貪心的思想,每次 從 未選 點集中 選出距離已選點集最近 最優 的乙個點,然後將此點加入已選點集,嘗試通過此點 更新 源點 到未選...