動態規劃最短路徑

動態規劃(Dynamic Programming)是一種解決最優化問題的方法論,它將大問題分解為較小的、相似的子問題,並儲存這些子問題的答案以避免重複計算。在圖形中最短路徑問題中,動態規劃可以有效地找到從一個頂點到另一個頂點的最短路徑。

最短路徑問題可以分為兩種類型:

  1. 單源最短路徑問題(Single-Source Shortest Path Problem):給定一個圖形和一個源頂點,找到從源頂點到所有其他頂點的最短路徑。
  2. 單目標最短路徑問題(Single-Destination Shortest Path Problem):給定一個圖形和一個目標頂點,找到所有頂點到目標頂點的最短路徑。

在動態規劃中,最短路徑問題通常使用Bellman-Ford算法或Dijkstra算法來解決。這些算法的基本思想是使用動態規劃來疊代地更新每個頂點到源頂點的最短路徑長度。

以下是一個簡單的動態規劃最短路徑算法的示例:

def shortest_path(graph, source):
    # 初始化最短路徑長度
    dist = {v: float('inf') for v in graph}
    dist[source] = 0

    # 使用動態規劃疊代更新最短路徑長度
    for i in range(len(graph[source])):
        for v in graph:
            for w in graph[v]:
                alt = dist[v] + graph[v][w]
                if alt < dist[w]:
                    dist[w] = alt

    # 返回最短路徑長度
    return dist

# 示例圖形
graph = {
    'A': {'B': 1, 'C': 2, 'D': 3},
    'B': {'A': 1, 'C': 3, 'D': 2},
    'C': {'A': 2, 'B': 3, 'D': 1},
    'D': {'A': 3, 'B': 2, 'C': 1}
}

# 找到從'A'到所有頂點的最短路徑
shortest_paths = shortest_path(graph, 'A')
print(shortest_paths)

這個算法會疊代地更新每個頂點到源頂點的最短路徑長度。在每一輪疊代中,我們會檢查每個頂點的鄰居,並更新其最短路徑長度,如果發現更短的路徑。這個過程會一直持續到沒有任何頂點的最短路徑長度可以被進一步減少。

請注意,這個算法假設圖形中沒有負邊權,因為負邊權會導致Bellman-Ford算法失效。如果圖形中有負邊權,則可以使用Dijkstra算法或其變體來解決最短路徑問題。