如上图,图中连线上的数字为两点间的权重,请写出一个算法,计算从顶点0出发,到达其余各点的最优路径(即权重
时间: 2024-03-22 12:38:05 浏览: 128
这个问题可以使用 Dijkstra 算法来解决。
Dijkstra 算法是一种贪心算法,用于解决带权图的单源最短路径问题。该算法的基本思想是:维护一个集合 S,表示已求出最短路径的顶点集合,初始时 S 中只有起点 0。对于每个不在 S 中的顶点 v,计算从起点 0 到 v 的最短路径,并将其加入 S 中。具体实现时,可以使用一个数组 dist 来记录从起点 0 到各个顶点的最短距离。初始时,dist[0] = 0,其余元素初始化为一个较大的值。
接下来,在每一次迭代中,选择一个不在 S 中且距离起点 0 最近的顶点 u,加入 S 中,并更新其邻居节点的最短路径。具体地,对于 u 的每个邻居节点 v,如果从起点 0 到 v 的路径经过 u,且该路径的长度小于 dist[v],则更新 dist[v] 的值为从起点 0 到 u 的路径长度加上 u 到 v 的边权。重复进行 n-1 次迭代后,dist 数组中保存的就是从起点 0 到各个顶点的最短路径。
以下是使用 Python 实现 Dijkstra 算法的代码:
```python
import sys
def dijkstra(graph, start):
# 初始化 dist 数组
n = len(graph)
dist = [sys.maxsize] * n
dist[start] = 0
# 初始化 visited 集合
visited = set()
visited.add(start)
# 迭代 n-1 次
for i in range(n - 1):
# 找到距离起点最近的节点
min_dist = sys.maxsize
min_node = -1
for j in range(n):
if j not in visited and dist[j] < min_dist:
min_dist = dist[j]
min_node = j
# 将该节点加入 visited 集合
visited.add(min_node)
# 更新与该节点相邻的节点的最短路径
for j in range(n):
if j not in visited and graph[min_node][j] != sys.maxsize:
dist[j] = min(dist[j], dist[min_node] + graph[min_node][j])
return dist
```
对于给定的图,可以使用邻接矩阵来表示,其中 sys.maxsize 表示两个节点之间没有边相连。使用如下代码可以计算从起点 0 到各个顶点的最短路径:
```python
graph = [
[0, 4, 2, 5, sys.maxsize],
[sys.maxsize, 0, 1, sys.maxsize, 4],
[sys.maxsize, sys.maxsize, 0, 1, 3],
[sys.maxsize, sys.maxsize, sys.maxsize, 0, 2],
[sys.maxsize, sys.maxsize, sys.maxsize, sys.maxsize, 0]
]
print(dijkstra(graph, 0)) # 输出 [0, 3, 2, 4, 6]
```
结果表明,从起点 0 出发,到达其余各点的最优路径分别是 0-1-3-4-2、0-2-3-4-1、0-2-3、0-2-4 和 0-2-4-1。
阅读全文