写个迪杰斯特拉算法求无向网的最短路径的代码
时间: 2023-06-22 08:21:25 浏览: 107
求最短路径的迪杰斯特拉算法
4星 · 用户满意度95%
好的,以下是使用Python语言实现的迪杰斯特拉算法求无向网的最短路径的代码:
```python
import heapq # 用于实现堆结构
def dijkstra(graph, start):
"""
:param graph: 无向网的邻接矩阵表示,graph[i][j]表示点i到点j的边权,若不存在则为float('inf')
:param start: 起点
:return: 返回从起点到所有点的最短路径长度列表
"""
n = len(graph) # 无向网的节点数
dist = [float('inf')] * n # 用于存储起点到各个点的最短路径长度,默认为无穷大
dist[start] = 0 # 起点到自身的距离为0
heap = [(0, start)] # 用于实现堆结构的列表,存储未确定最短路径的点
while heap: # 当堆不为空时
d, u = heapq.heappop(heap) # 取出距离最短的点
if d > dist[u]: # 如果该点的距离大于已知的最短距离,则忽略
continue
for v in range(n): # 遍历所有点
if graph[u][v] != float('inf'): # 如果存在边(u,v)
if dist[u] + graph[u][v] < dist[v]: # 如果经过u到v的距离小于已知的最短距离,则更新dist[v]
dist[v] = dist[u] + graph[u][v]
heapq.heappush(heap, (dist[v], v)) # 将v加入堆中
return dist
```
这段代码中,使用了Python内置的heapq库来实现堆结构,用于存储未确定最短路径的点。在算法的实现过程中,首先初始化起点到各个点的最短路径长度为无穷大,起点到自身的距离为0,并将起点加入堆中。然后,重复执行以下步骤,直到堆为空:
1. 取出距离最短的点u;
2. 遍历所有点v,如果存在边(u,v),则更新dist[v]为经过u到v的距离,同时将v加入堆中。
最后返回起点到所有点的最短路径长度列表dist。
希望我的回答能够帮助到您。
阅读全文