当前位置: 首页 > article >正文

代码随想录算法训练营第六十四天| 图论9—卡码网47. 参加科学大会,94. 城市间货物运输 I

每日被新算法方式轰炸的一天,今天是dijkstra(堆优化版)以及Bellman_ford ,尝试理解中,属于是只能照着代码大概说一下在干嘛。

47. 参加科学大会

https://kamacoder.com/problempage.php?pid=1047

dijkstra(堆优化版),主要区别用gpt总结了一下

  1. 第一步,选源点到哪个节点近且该节点未被访问过
  2. 第二步,该最近节点被标记访问过
  3. 第三步,更新非访问节点到源点的距离(即更新minDist数组)

其中核心部分主要是最小堆来从当前所有候选路径中找出距离起点最近的节点,更新它所连接的其他节点的最短路径值。从堆里取出当前距离起点最近的节点,并尝试用它来更新所有邻接点的距离,直到终点被访问或堆为空。也就是中间while函数的意义,其余代码主要是构建堆以及处理输入。

import heapqclass Edge:def __init__(self, to, val):self.to = toself.val = valdef dijkstra(n, m, edges, start, end):grid = [[] for _ in range(n + 1)]for p1, p2, val in edges:grid[p1].append(Edge(p2, val))minDist = [float('inf')] * (n + 1)visited = [False] * (n + 1)pq = []heapq.heappush(pq, (0, start))minDist[start] = 0while pq:cur_dist, cur_node = heapq.heappop(pq)if visited[cur_node]:continuevisited[cur_node] = Truefor edge in grid[cur_node]:if not visited[edge.to] and cur_dist + edge.val < minDist[edge.to]:minDist[edge.to] = cur_dist + edge.valheapq.heappush(pq, (minDist[edge.to], edge.to))return -1 if minDist[end] == float('inf') else minDist[end]# 输入
n, m = map(int, input().split())
edges = [tuple(map(int, input().split())) for _ in range(m)]
start = 1  # 起点
end = n    # 终点# 运行算法并输出结果
result = dijkstra(n, m, edges, start, end)
print(result)

94. 城市间货物运输 I

https://kamacoder.com/problempage.php?pid=1152

最主要区别在于Bellman_ford能解决负数的权重的问题,而dijkstra不行,

Bellman_ford算法的核心思想是 对所有边进行松弛n-1次操作(n为节点数量),从而求得目标最短路。

然后是该算法的核心思想:松弛操作

  • 外层循环最多执行 n-1 次(这是 Bellman-Ford 的核心步骤)

  • 每次遍历所有边,尝试更新目标点的最短距离(即“松弛”操作)

  • 如果一轮下来没有任何更新,说明最短路径已稳定,提前退出循环(优化)

def main():n, m = map(int, input().strip().split())edges = []for _ in range(m):src, dest, weight = map(int, input().strip().split())edges.append([src, dest, weight])minDist = [float("inf")] * (n + 1)minDist[1] = 0  # 起点处距离为0for i in range(1, n):updated = Falsefor src, dest, weight in edges:if minDist[src] != float("inf") and minDist[src] + weight < minDist[dest]:minDist[dest] = minDist[src] + weightupdated = Trueif not updated:  # 若边不再更新,即停止回圈breakif minDist[-1] == float("inf"):  # 返还终点权重return "unconnected"return minDist[-1]if __name__ == "__main__":print(main())

http://www.lryc.cn/news/2380427.html

相关文章:

  • oracle序列自增问题
  • 开启健康生活的多元养生之道
  • 【Vite】前端开发服务器的配置
  • 鸿蒙OSUniApp 制作自定义弹窗与模态框组件#三方框架 #Uniapp
  • Spring Security与Spring Boot集成原理
  • VScode各文件转化为PDF的方法
  • 精益数据分析(58/126):移情阶段的深度实践与客户访谈方法论
  • Vue3学习(组合式API——Watch侦听器、watchEffect()详解)
  • 【node.js】安装与配置
  • 《AI大模型应知应会100篇》第62篇:TypeChat——类型安全的大模型编程框架
  • HttpMessageConverter 的作用是什么? 它是如何实现请求体到对象、对象到响应体的自动转换的(特别是 JSON/XML)?
  • EdgeShard:通过协作边缘计算实现高效的 LLM 推理
  • 火山 RTC 引擎9 ----集成 appkey
  • ArcGIS Pro 3.4 二次开发 - 框架
  • Adminer:一个基于Web的轻量级数据库管理工具
  • RK3568下QT实现按钮切换tabWidget
  • 2025 OceanBase 开发者大会全议程指南
  • GitHub 趋势日报 (2025年05月15日)
  • day017-磁盘管理-实战
  • 【成品设计】STM32和UCOS-II的项目
  • 当通过PHP在线修改文件数组遇到不能及时生效问题
  • Ngrok 配置:实现 Uniapp 前后端项目内网穿透
  • 鸿蒙ArkUI体验:Hexo博客客户端开发心得
  • 鸿蒙NEXT开发动画案例10
  • Python 的 os 库常见使用方法(操作目录及文件)
  • 【Linux】Linux安装并配置Redis
  • 【11408学习记录】考研英语辞职信写作三步法:真题精讲+妙句活用+范文模板
  • 数据库(一):分布式数据库
  • Java并发编程-线程池(三)
  • 《黑马前端ajax+node.js+webpack+git教程》(笔记)——node.js教程+webpack教程(nodejs教程)