算法题 堆优化版本Dijkstra(Python)

该博客介绍了如何使用堆优化的Dijkstra算法解决有向图中1号点到n号点的最短路径问题。在给定的1.5×10^5个节点和边的范围内,算法需处理可能存在的重边和自环,且边权非负。当无法从1号点到达n号点时,输出-1。文章提供了一种输入输出格式,并给出具体的数据范围和样例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为非负值。

请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1。

输入格式

第一行包含整数n和m。

接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。

输出格式

输出一个整数,表示1号点到n号点的最短距离。

如果路径不存在,则输出-1。

数据范围

1≤n,m≤1.5×10^5
图中涉及边长均不小于0,且不超过10000。

输入样例:

3 3
1 2 2
2 3 1
1 3 4

输出样例:

3

代码:

from heapq import *

n, m = map(int, input().split())
idx = 0
h = [-1]*(n+1)
e, ne, w = [0]*(2*m+1), [0]*(2*m+1), [0]*(2*m+1)
st, dist = [False]*(n+1), [float('inf')]*(n+1)

def add(a, b, wei):
    global idx
    e[idx], w[idx] = b, wei
    h[a], ne[idx] = idx, h[a]
    idx += 1

def dijkstra():
    heap = []
    heappush(heap, [0, 1])
    dist[1] 
### 基于优化Dijkstra 算法 Python 实现 以下是基于优化Dijkstra 算法的一种标准实现方式。该算法利用优先队列(最小)来高效处理路径松弛操作,从而减少时间复杂度。 #### 使用 `heapq` 库实现优化 Python 的内置模块 `heapq` 提供了高效的数据结构支持,可以用来构建最小并快速提取最短距离节点。 ```python import heapq def dijkstra(graph, start): """ graph: 字典表示的图,键为节点,值为邻接表形式的字典 {邻居节点: 边权重} start: 起始节点 返回: dist 字典,其中 dist[v] 表示从起始节点到 v 的最短距离 """ # 初始化距离字典,默认无穷大 distances = {node: float('inf') for node in graph} distances[start] = 0 # 创建优先队列 (distance, node),初始只有起点 priority_queue = [(0, start)] while priority_queue: current_distance, current_node = heapq.heappop(priority_queue) # 如果当前弹出的距离大于已知最优距离,则跳过此节点 if current_distance > distances[current_node]: continue # 遍历相邻节点 for neighbor, weight in graph[current_node].items(): distance = current_distance + weight # 发现有更优路径则更新距离,并加入优先队列 if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(priority_queue, (distance, neighbor)) return distances # 测试用例 if __name__ == "__main__": example_graph = { 'A': {'B': 1, 'C': 4}, 'B': {'A': 1, 'C': 2, 'D': 5}, 'C': {'A': 4, 'B': 2, 'D': 1}, 'D': {'B': 5, 'C': 1} } result = dijkstra(example_graph, 'A') print(result) # 输出各节点的最短距离 ``` 上述代码实现了基于优化Dijkstra 算法[^2]。通过维护一个优先队列存储待扩展的节点及其对应的当前最短距离,每次选取具有最小距离的节点进行扩展,直到遍历完成整个图为止。 #### 关键点解析 - **初始化**: 将所有节点的距离设置为正无穷大 (`float('inf')`),并将起始节点的距离设为零。 - **优先队列**: 利用 `heapq` 构建最小,确保每次都能取出当前未访问节点中的全局最小距离节点。 - **松弛操作**: 对每个节点的邻居逐一尝试更新其最短距离;如果发现新的较短路径,则将其加入优先队列以便后续扩展。 这种实现方法的时间复杂度接近 \(O((V+E)\log V)\)[^2],其中 \(V\) 是顶点数,\(E\) 是边数。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值