请编写一个可运行的Dijkstra算法
时间: 2024-05-13 08:14:03 浏览: 46
一个关于Dijkstra算法的题目
4星 · 用户满意度95%
以下是一个使用Python编写的Dijkstra算法实现:
```python
import heapq
def dijkstra(adj_matrix, start):
"""
adj_matrix: 二维数组,表示带权有向图的邻接矩阵
start: 起点
"""
n = len(adj_matrix)
dist = [float('inf')] * n # 距离初始化为无穷大
visited = [False] * n # 标记是否访问过
dist[start] = 0 # 起点距离为0
heap = [(0, start)] # 堆初始化,存储(距离, 节点)二元组
while heap:
(d, u) = heapq.heappop(heap) # 取出堆顶元素
if visited[u]: # 如果该节点已访问过,直接跳过
continue
visited[u] = True # 标记为已访问
for v in range(n):
if adj_matrix[u][v] > 0: # 如果该节点有出边
if dist[v] > dist[u] + adj_matrix[u][v]: # 如果通过u到v的距离更小
dist[v] = dist[u] + adj_matrix[u][v] # 更新距离
heapq.heappush(heap, (dist[v], v)) # 加入堆中
return dist
```
使用示例:
```python
# 定义邻接矩阵
adj_matrix = [
[0, 10, 0, 30, 100],
[0, 0, 50, 0, 0],
[0, 0, 0, 0, 10],
[0, 0, 20, 0, 60],
[0, 0, 0, 0, 0]
]
# 调用dijkstra函数,计算起点0到其他节点的最短距离
dist = dijkstra(adj_matrix, 0)
# 输出结果
print(dist) # [0, 10, 50, 30, 60]
```
这个算法实现了Dijkstra算法的核心思想,即从起点开始,每次选择距离最小的节点进行扩展。具体地,算法使用一个堆来维护所有已经访问过但还未确定最短距离的节点,每次从堆中取出距离最小的节点进行扩展,并更新其邻居节点的距离。最后,算法返回起点到所有节点的最短距离。
阅读全文