(演算法)(圖論)最短路徑演算法

--

Dijkstra Algorithm(單源最短路徑 )

此篇把使用的過程寫得很清楚,方法可以自己看網上,寫得一定比我好。限制不能看有負權值的圖。

原本時間複雜度是O(V平方)(要用鄰接表,Adjacency list的時間複雜度比matrix好一些,最壞情況是一樣啦),因為要看所有點(V),並且要找目前離原點最遠的點(V,還未找過的)。但找最小的點可以用priority_queue,可以達成O((E+V)log V),最最好可以用一個特殊的結構Fibonacci heap,可以達成最好的O(E+V log V)。

題目: Leetcode題目詳解

AcWing 849 (模板題,不用優化也可以過)

AcWing 850 (模板題,用priority_queue優化)

AcWing 178

Leetcode 502(鎖住QQ)

Leetcode 787 : Dijkstra特殊變形題,要記錄走過幾個點,假如超出點的限制,還不行,所以不能用一般的Dijkstra,頗難。這篇解答講得超好(用Dijkstra方法的話),dp[i][j] = Dist to reach j using atmost i edges from src。或是運用多一個東西來記錄點。

Leetcode 743 : 可以用任意最短路徑演算法,用dis[]找出是否起點能到所有點且最長距離。

Bellman-Ford Algorithm(單源最短路徑 )

此篇為基礎。

核心 : 強迫每點都更新,第K次跟新時,保證有最多走K不時的路徑,所以最多V-1輪就結束了(因V個點最多就有V-1個Path),如果超出最大輪,代表有負環,並且可以記錄上一輪的dis,假如更新之後並沒有更好的dis,可以提早跳出。

題目: Leetcode 好像跟Dijkstra的leetcode題目差不多,但這個演算法還可以測試是否有負數邊。

AcWing 853 (Bellman-Ford 模板題)

Leetcode 787

Leetcode 743

Bellman-Ford Algorithm 優化 SPFA演算法(單源最短路徑)

因為Bellmen每次更新會看所有邊,但其實不需要,只要把那些有更新距離的點放入就好了,用queue實作。最好時間複雜度O(E),最爛時間複雜度跟Bellmen一樣O(VE)。

題目

AcWing 851 (SPFA 模板題) : 這題的第一個題解講得超好的,對SPFA講得很詳細。

AcWing 340 (SPFA 變形)

Floyd-Warshall Algorithm(所有節點最短路徑)

這篇這篇(非常的清楚)可以了解一下。

題目:

UVA 12319 算是簡單的應用了,基本題,CPE2020 12月出現的題目,解答。ps.這題好像也可以用其他演算法。

Leetcode 1334 (模板題)

--

--

Kola (Yan-Hao Wang)
Kola (Yan-Hao Wang)

Written by Kola (Yan-Hao Wang)

在系統軟體跟資安領域學習的學生

No responses yet