洛谷 P4779 模板 單源最短路徑(標準版)

2021-10-04 18:31:56 字數 3632 閱讀 6791

求單源最短路徑。

可以記住的模板有:堆優化的 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 衷心祝願大家不再重蹈覆轍。...