P市有n个公交站,之间连接着m条道路。P市计划新开设一条公交线路,该线路从城市的东站(s点)修建到西站(t点),请为P市设计一条满足上述条件并且最短的公交线路图。
时间: 2024-06-11 07:09:37 浏览: 124
这是一个经典的最短路问题,可以使用Dijkstra算法或者Floyd算法解决。
Dijkstra算法:
1. 初始化距离数组dist,将所有点的距离设为无穷大,起点s的距离设为0。
2. 将起点s加入集合S中。
3. 对于起点s能够直接到达的点v,更新v的距离为dist[v] = dist[s] + w(s, v),其中w(s, v)表示s到v的边权。
4. 从未加入集合S的点中选取距离最小的点u加入集合S,重复步骤3。
5. 直到终点t被加入集合S,或者所有点都已加入集合S为止。
6. 最短路径即为dist[t]。
Floyd算法:
1. 初始化距离矩阵dist,将所有点之间的距离设为无穷大,自己到自己的距离设为0。
2. 对于每个中转点k,遍历所有点i和j,更新dist[i][j] = min(dist[i][j], dist[i][k]+dist[k][j])。
3. 最短路径即为dist[s][t]。
这里提供Dijkstra算法的Python实现:
import heapq
def dijkstra(graph, s, t):
n = len(graph)
dist = [float('inf')] * n
dist[s] = 0
visited = set()
heap = [(0, s)]
while heap:
d, u = heapq.heappop(heap)
if u == t:
return dist[t]
if u in visited:
continue
visited.add(u)
for v, w in graph[u]:
if v not in visited:
if dist[u] + w < dist[v]:
dist[v] = dist[u] + w
heapq.heappush(heap, (dist[v], v))
return -1
# 示例
n = 5
m = 7
graph = [[] for _ in range(n)]
edges = [(0, 1, 2), (0, 2, 5), (1, 2, 4), (1, 3, 3), (2, 3, 1), (2, 4, 6), (3, 4, 7)]
for u, v, w in edges:
graph[u].append((v, w))
graph[v].append((u, w))
print(dijkstra(graph, 0, 4)) # 输出14
阅读全文