题目描述 罗老师被邀请参加一个舞会,是在城市n,而罗老师当前所处的城市为1,附近还有很多城市2~n-1,有些城市之间没有直接相连的路,有些城市之间有直接相连的路,这些路都是双向的,当然也可能有多条。 现在给出直接相邻城市的路长度,罗老师想知道从城市1到城市n,最短多少距离。 输入 输入n, m,表示n个城市和m条路; 接下来m行,每行a b c, 表示城市a与城市b有长度为c的路。 输出 输出1到n的最短路。如果1到达不了n,就输出-1。
时间: 2024-03-23 15:37:25 浏览: 18
这是一道经典的最短路径问题,可以使用 Dijkstra 算法或者 Bellman-Ford 算法来解决。以下是 Dijkstra 算法的实现过程:
1. 初始化距离数组 dist,将所有节点的距离初始化为无穷大,将起点 1 的距离设为 0。
2. 初始化一个优先队列(最小堆),将起点 1 加入队列。
3. 当队列非空时,取出队列中距离起点最近的节点 u,并遍历 u 的所有邻居节点 v。
4. 如果从起点到 v 的距离 dist[v] 大于从起点到 u 的距离加上 u 到 v 的距离,就更新 dist[v] 的距离,并将 v 加入队列。
5. 重复步骤 3-4 直到队列为空,此时 dist[n] 就是从起点 1 到终点 n 的最短距离。如果 dist[n] 为无穷大,则说明起点无法到达终点。
以下是 Python 代码实现示例:
```python
import heapq
n, m = map(int, input().split())
graph = [[] for _ in range(n+1)]
# 构建图
for _ in range(m):
a, b, c = map(int, input().split())
graph[a].append((b, c))
graph[b].append((a, c))
dist = [float('inf')] * (n+1)
dist[1] = 0
pq = [(0, 1)]
while pq:
d, u = heapq.heappop(pq)
if d > dist[u]: # 如果当前距离大于已知最短距离,则忽略
continue
for v, w in graph[u]:
if dist[v] > dist[u] + w:
dist[v] = dist[u] + w
heapq.heappush(pq, (dist[v], v))
if dist[n] == float('inf'):
print(-1)
else:
print(dist[n])
```
需要注意的是,Python 中的 heapq 模块实现的是最小堆,所以我们将优先队列中的元素设置为 `(dist[v], v)`,这样可以保证每次从队列中取出的节点是距离起点最近的。