求起始点1到N的最短路径.多组测试数据,对于每组数据 第一行是两个整数N, M。分别代表定点的数个和边的关系的个数。 从第二行至M+1行,每行三个整数,start, end, value。代表,节点start,节点end之间有一条长度为value的无向边。求1到N的最短路径。 (M, N, start, end, value < 100)对于每组测试数据,输出一个整数result,代表1至N的最短路径的value。
时间: 2024-03-17 08:44:57 浏览: 46
这道题可以使用 Dijkstra 算法求解。具体步骤如下:
1. 初始化距离数组 dist[],将起点到每个顶点的距离设为无穷大,起点到自己的距离设为 0。
2. 创建一个集合 visited,用于记录已经确定最短路径的顶点。
3. 从起点开始,依次遍历与起点相邻的每个顶点,更新它们的距离。具体操作如下:
a. 选择一个距离起点最短的未确定最短路径的顶点 u。
b. 将顶点 u 加入 visited 集合中。
c. 遍历与顶点 u 相邻的每个顶点 v,更新 v 的距离。如果新的距离比原来的距离小,则更新 dist[v] 的值。
4. 重复步骤 3 直到所有顶点的最短路径都被确定。
5. 最终,dist[] 数组中存储的就是起点到每个顶点的最短路径长度。
需要注意的是,Dijkstra 算法只适用于没有负权边的图。如果图中存在负权边,可以考虑使用 Bellman-Ford 算法或 Floyd 算法。
以下是 Python 代码实现:
```python
import heapq
INF = 0x3f3f3f3f
def dijkstra(graph, start, end):
n = len(graph)
dist = [INF] * n
visited = set()
heap = [(0, start)]
dist[start] = 0
while heap:
(d, u) = heapq.heappop(heap)
if u in visited:
continue
visited.add(u)
for v, w in graph[u]:
if dist[u] + w < dist[v]:
dist[v] = dist[u] + w
heapq.heappush(heap, (dist[v], v))
return dist[end]
if __name__ == '__main__':
while True:
n, m = map(int, input().split())
if n == 0 and m == 0:
break
graph = [[] for _ in range(n)]
for _ in range(m):
start, end, value = map(int, input().split())
graph[start-1].append((end-1, value))
graph[end-1].append((start-1, value))
result = dijkstra(graph, 0, n-1)
print(result)
```
时间复杂度为 O(mlogn),其中 n 和 m 分别为顶点数和边数。
阅读全文