如何從加權圖形中找出最短路徑
從加權圖形中找出最短路徑可以使用多種算法,其中最常用的是迪傑斯特拉(Dijkstra)算法。這個算法可以用來找出兩個點之間的單源最短路徑。
以下是使用Dijkstra算法找出最短路徑的步驟:
- 初始化源點的距離為0,其他點的距離為無窮大。
- 從未訪問過的點中選擇距離源點最近的點。
- 更新與該點相連的未訪問點的距離。
- 重複步驟2和步驟3,直到所有點都被訪問過或找到目標點為止。
以下是一個簡單的Python實現:
from collections import deque
class Graph:
def __init__(self, vertices):
self.V = vertices # 頂點數量
self.graph = [[] for _ in range(vertices)]
def addEdge(self, u, v, w):
self.graph[u].append((v, w))
def shortestPath(self, src):
dist = [float('inf')] * self.V
dist[src] = 0
q = deque()
q.append(src)
while q:
u = q.popleft()
for v, w in self.graph[u]:
if dist[v] > dist[u] + w:
dist[v] = dist[u] + w
q.append(v)
return dist
# 圖形示例
g = Graph(5)
g.addEdge(0, 1, 4)
g.addEdge(0, 2, 5)
g.addEdge(0, 3, 1)
g.addEdge(1, 2, 2)
g.addEdge(1, 3, 6)
g.addEdge(2, 3, 3)
g.addEdge(2, 4, 7)
g.addEdge(3, 4, 2)
# 查找從頂點0到其他頂點的最短路徑
dist = g.shortestPath(0)
# 輸出最短路徑
for i in range(1, g.V):
if dist[i] != float('inf'):
print(f"Vertex {i} is reachable with distance {dist[i]} from source vertex 0")
這個程式會輸出從頂點0到其他每個頂點的最短路徑距離。請注意,這個算法只適用於非負權重的圖形,並且在圖形中有無限循環時可能會出現問題。