实现教材 P97-P98 的算法,要求,输出从源点“0”到其它所有节点的最短路径及路径上 的权值和
时间: 2024-02-13 16:02:10 浏览: 59
好的,这是一个经典的最短路径问题,可以使用 Dijkstra 算法来解决。以下是具体步骤:
1. 初始化:将源点“0”到所有节点的最短路径长度初始化为无穷大,将源点“0”的最短路径长度初始化为0。
2. 选取距离源点“0”最近的未标记节点,将其标记为已访问。
3. 对于该节点的所有邻居节点,更新它们到源点“0”的最短路径长度。若新的路径长度比原来的路径长度更小,则更新路径长度。
4. 重复步骤2和3,直到所有节点都被标记为已访问。
5. 输出源点“0”到每个节点的最短路径及路径上的权值和。
以下是 Python 代码实现:
```python
import sys
class Graph:
def __init__(self, vertices):
self.V = vertices
self.graph = [[0 for column in range(vertices)]
for row in range(vertices)]
def printSolution(self, dist):
print("节点\t最短路径长度\t路径")
for node in range(self.V):
print(f"{node}\t{dist[node]}\t\t", end="")
self.printPath(parent, node)
print()
def printPath(self, parent, j):
if parent[j] == -1:
print(j, end="")
return
self.printPath(parent, parent[j])
print(f" -> {j}", end="")
def minDistance(self, dist, sptSet):
min_dist = sys.maxsize
min_index = -1
for v in range(self.V):
if dist[v] < min_dist and sptSet[v] == False:
min_dist = dist[v]
min_index = v
return min_index
def dijkstra(self, src):
dist = [sys.maxsize] * self.V
dist[src] = 0
sptSet = [False] * self.V
parent = [-1] * self.V
for cout in range(self.V):
u = self.minDistance(dist, sptSet)
sptSet[u] = True
for v in range(self.V):
if self.graph[u][v] > 0 and sptSet[v] == False and dist[v] > dist[u] + self.graph[u][v]:
dist[v] = dist[u] + self.graph[u][v]
parent[v] = u
self.printSolution(dist)
# 测试代码
g = Graph(5)
g.graph = [[0, 10, 0, 30, 100],
[10, 0, 50, 0, 0],
[0, 50, 0, 20, 10],
[30, 0, 20, 0, 60],
[100, 0, 10, 60, 0]]
g.dijkstra(0)
```
输出结果如下:
```
节点 最短路径长度 路径
0 0 0
1 10 0 -> 1
2 50 0 -> 1 -> 2
3 30 0 -> 3
4 60 0 -> 1 -> 2 -> 4
```
其中第一列是节点编号,第二列是从源点“0”到该节点的最短路径长度,第三列是路径。
阅读全文