求單源最短路徑。
可以記住的模板有:堆優化的 dijkstra,bellman-ford,spfa。
堆優化的 dijkstra:演算法複雜度為 o(∣
e∣⋅t
dk+∣v
∣⋅tem
)o(|e|\cdot t_}+|v|\cdot t_})
o(∣e∣⋅
tdk+
∣v∣⋅
tem)
,其中 ∣e∣
|e|∣e
∣ 是邊集大小,∣v∣
|v|∣v
∣ 是點集大小,t
dkt_}
tdk 是對佇列進行修改(新增元素或改變乙個元素的值 decrease-key)對應的時間,t
emt_}
tem 是取佇列中最小值(並刪除)對應的時間(extract-minimum)。對於二叉堆來說,tdk=
log∣v
∣t_}=\log|v|
tdk=
log∣v∣
,訪問最小值要 o(1
)o(1)
o(1)
,但是刪除最小值後需要調整堆來滿足性質,對應複雜度 o
(log∣
v∣)o(\log|v|)
o(log∣v∣
),因此堆優化的 dijkstra 的時間複雜度為 o((
∣e∣+
∣v∣)
log∣v
∣)o((|e|+|v|)\log|v|)
o((∣e∣
+∣v∣
)log∣v
∣)。以上參考 wikipedia
bellman-ford:每次對所有的邊進行鬆弛操作,進行 ∣v∣
−1|v|-1
∣v∣−
1 次,對於無負環圖來說,離源點最遠的點最多相距 ∣v∣
−1|v|-1
∣v∣−
1 條邊,因此進行 ∣v∣
−1|v|-1
∣v∣−
1 次操作可以找到到所有點的最短路徑。之後再進行一次操作,假如仍能進行鬆弛,則存在負環。時間複雜度為 o(∣
v∣⋅∣
e∣)o(|v|\cdot|e|)
o(∣v∣⋅
∣e∣)
。spfa:全稱 shortest path faster algorithm,是對 bellman-ford 的改進,不同於每次對所有邊進行鬆弛,spfa 維護乙個點集,該點集中存放上一次鬆弛後的點,每次從該點集中取點進行鬆弛。spfa 在隨機稀疏圖中效果較好,並且可以處理負權圖的情況,但是最差複雜度可達 o(∣
v∣⋅∣
e∣)o(|v|\cdot|e|)
o(∣v∣⋅
∣e∣)
。總的來說,對於非負權圖來說,堆優化的 dijkstra 是最優的,判斷負環迴路時用 spfa。
堆優化的 dijkstra **如下:
spfa 和 bellman-ford 較慢,無法通過所有測試點
spfa **如下:
#include
#include
#include
#include
#define inf 0x3f3f3f3f
#define maxn 100010
#define maxm 200010
using
namespace std;
int n,m,s,u,v,w,dis[maxn]
,cnt[maxn]
,tot,head[maxn]
;bool inq[maxn]
;struct edgeedge[maxm]
;void
addedge
(int u,
int v,
int w)
bool
spfa()
}}}return
true;}
intmain()
spfa()
;for
(int i=
1;i<=n;i++
)printf
("%d "
,dis[i]);
return0;
}
bellman-ford **如下:
#include
#include
#include
#define inf 0x3f3f3f3f
#define maxn 100010
#define maxm 200010
using
namespace std;
int n,m,s,u,v,w,dis[maxn]
,tot;
struct edgeedge[maxm]
;void
addedge
(int u,
int v,
int w)
bool
bellmanford()
if(!flag)
return
true;}
for(
int j=
0;j)return
true;}
intmain()
bellmanford()
;for
(int i=
1;i<=n;i++
)printf
("%d "
,dis[i]);
return0;
}
洛谷P4779 單源最短路徑與Dijkstra演算法
蒟蒻出品,歡迎指正 dijkstra演算法 由於字母太多,以下統一用dij代替 逃 dij演算法,使用廣度優先搜尋與貪心演算法解決單源圖的最短路徑問題,不適用於有負權邊的圖。時間複雜度 o mlogn n為頂點數,m為邊數。演算法思路 對於所需求解的圖,首先假設任意兩頂點之間距離為正無窮。然後開始加...
洛谷 P4779 模板 單源最短路徑(標準版)
洛谷 p4779 模板 單源最短路徑 標準版 2018 年 7 月 19 日,某位同學在 noi day 1 t1 歸程 一題裡非常熟練地使用了乙個廣為人知的演算法求最短路。然後呢?100 60 ag cu 最終,他因此沒能與理想的大學達成契約。小 f 衷心祝願大家不再重蹈覆轍。給定乙個 n 個點,...
洛谷P4779 模板 單源最短路徑(標準版)
2018 年 7 月 19 日,某位同學在 noi day 1 t1 歸程 一題裡非常熟練地使用了乙個廣為人知的演算法求最短路。然後呢?100 rightarrow 60100 60 ag rightarrow cuag cu 最終,他因此沒能與理想的大學達成契約。小 f 衷心祝願大家不再重蹈覆轍。...