📅  最后修改于: 2023-12-03 15:30:27.246000             🧑  作者: Mango
Dijkstra的算法是一种最短路径的贪婪算法。该算法通过使用一个数组来保存源节点与其他节点之间的距离和已知最短路径。该算法的主要思想是从源节点出发,依次考虑与源节点相邻的节点,更新它们到源节点的距离和已知最短路径。这个过程由不断选择距离最短的未访问节点来实现,并不断扩展其周围的节点。
Dijkstra的算法可以通过邻接表来表示。邻接表是一个包含所有节点的链表数组,其中每个链表表示每个节点的邻居节点。因此,对于每个节点,我们需要维护它到源节点的距离和已知最短路径。
下面是使用Python实现Dijkstra算法的代码,其中Graph类表示邻接表表示的图,使用heapq模块来实现优先队列:
import heapq
class Graph:
def __init__(self, n):
self.n = n
self.adj_list = [[] for _ in range(n)]
def add_edge(self, u, v, w):
self.adj_list[u].append((v, w))
self.adj_list[v].append((u, w))
def dijkstra(self, s):
dist = [float('inf')] * self.n
dist[s] = 0
heap = [(0, s)]
while heap:
d, u = heapq.heappop(heap)
if d == dist[u]:
for v, w in self.adj_list[u]:
if dist[v] > d + w:
dist[v] = d + w
heapq.heappush(heap, (dist[v], v))
return dist
# 示例代码
g = Graph(5)
g.add_edge(0, 1, 2)
g.add_edge(0, 4, 4)
g.add_edge(1, 2, 3)
g.add_edge(2, 3, 1)
g.add_edge(3, 4, 3)
print(g.dijkstra(0))
该实现的时间复杂度为O(ElogV),其中V为节点数,E为边数。