最短路徑 (Shortest Path)

在圖中尋找兩頂點之間權重最小的路徑

問題定義

給定有向或無向加權圖,尋找從起點到終點總權重最小的路徑。根據起點數量可分為單源最短路徑與全源最短路徑。

Dijkstra 演算法

適用於非負權重圖。使用優先佇列每次選取距離最小的未處理節點,放鬆其相鄰邊。時間 O((V+E) log V)。

def dijkstra(graph, start): dist = {v: float('inf') for v in graph} dist[start] = 0 pq = [(0, start)] while pq: d, u = heapq.heappop(pq) if d > dist[u]: continue for v, w in graph[u]: if dist[u] + w < dist[v]: dist[v] = dist[u] + w heapq.heappush(pq, (dist[v], v)) return dist

Bellman-Ford 演算法

可處理負權重邊,並能偵測負權重環。時間 O(VE)。執行 V-1 次對所有邊進行放鬆操作。

Floyd-Warshall 演算法

全源最短路徑,動態規劃方法。時間 O(V³),空間 O(V²)。適用於密集圖。

本課程範例

相關連結