以邻接表作存储结构实现求从源点到其余各顶点的最短路径的 Dijkstra 算法。
时间: 2024-02-25 22:56:38 浏览: 98
Dijkstra算法邻接表实现
4星 · 用户满意度95%
好的,我来解答您的问题。
Dijkstra 算法是一种用于解决单源最短路径问题的贪心算法。算法的基本思想是:维护一个集合 S,该集合中的点已经求出了从源点到达的最短路径,然后每次从未被访问的点中选择一个距离源点最近的点加入集合 S,并更新该点到所有未访问的点的距离。
下面是使用邻接表实现 Dijkstra 算法的具体步骤:
1. 初始化:创建一个大小为 V 的数组 dist,将源点的 dist 值设为 0,其余点的 dist 值设为正无穷大,创建一个大小为 V 的数组 visited,将所有点的 visited 值设为 false。
2. 从未访问的点中选择一个距离源点最近的点 u,将该点的 visited 值设为 true。
3. 对于 u 的每一个邻居 v,如果 v 的 visited 值为 false,那么更新 v 的 dist 值为 min(dist[v], dist[u] + weight(u,v)),其中 weight(u,v) 表示边 (u,v) 的权值。
4. 重复步骤 2 和步骤 3,直到所有点都被访问过。
下面是使用 Python 实现 Dijkstra 算法的代码,假设图的邻接表存储在变量 adjacency_list 中:
```python
import heapq
def dijkstra(adjacency_list, source):
# 初始化
n = len(adjacency_list)
dist = [float('inf')] * n
dist[source] = 0
visited = [False] * n
heap = [(0, source)]
while heap:
# 从未访问的点中选择一个距离源点最近的点
d, u = heapq.heappop(heap)
if visited[u]:
continue
visited[u] = True
# 更新 u 的每一个邻居的 dist 值
for v, w in adjacency_list[u]:
if not visited[v] and dist[v] > dist[u] + w:
dist[v] = dist[u] + w
heapq.heappush(heap, (dist[v], v))
return dist
```
其中,heapq 模块提供了堆的实现,可以方便地实现从未访问的点中选择一个距离源点最近的点的操作。时间复杂度为 O(ElogV),其中 E 表示边的数量,V 表示点的数量。
阅读全文