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

图最短路评测:Dijkstra 对了,也可能用错场景

图最短路评测:Dijkstra 对了,也可能用错场景

一、最短路算法不是只背名字

图论题里,最短路是高频考点。Dijkstra、Bellman-Ford、Floyd、SPFA 名字很多,但真正重要的是场景选择。边权是否为负、点数边数多大、是否多源多汇、是否需要路径恢复,都会影响算法选择。

Dijkstra 写对了,如果用在负权图上,答案仍然可能错。

二、先判断图条件

flowchart TD A[最短路问题] --> B{是否有负权} B -->|否| C[Dijkstra] B -->|是| D{是否有负环} D -->|无| E[Bellman-Ford] D -->|有| F[不存在稳定最短路] A --> G{是否全源} G --> H[Floyd 或多次单源]

算法选择前,先看边权、规模和查询次数。不要看到最短路就直接写 Dijkstra。

shortest_path_decision: non_negative_edges: dijkstra negative_edges_no_cycle: bellman_ford all_pairs_small_graph: floyd

选择依据写清楚,题解才完整。

三、Dijkstra 的关键不变量

import heapq def dijkstra(graph, start): dist = {start: 0} pq = [(0, start)] while pq: d, u = heapq.heappop(pq) if d != dist[u]: continue for v, w in graph[u]: nd = d + w if nd < dist.get(v, float("inf")): dist[v] = nd heapq.heappush(pq, (nd, v)) return dist

Dijkstra 的不变量是:每次从堆里弹出的最小距离节点,在非负边权条件下已经确定最短。负权会破坏这个不变量。

代码里的if d != dist[u]是为了跳过过期堆元素。Python 的堆不支持直接 decrease-key,所以会插入多份候选。

四、评测要覆盖错误场景

如果只用正权图测试,Dijkstra 写错场景也发现不了。评测集应该包含负权边、不可达点、多条等长路径、稠密图、稀疏图和大权值。

shortest_path_tests: unreachable_nodes: true negative_edge: true equal_distance_paths: true large_weight: true

还要测试路径恢复。如果题目要求输出路径,只返回距离不够。需要保存前驱节点,并在更新 dist 时同步更新 parent。

复杂度也要结合图表示。邻接表 + 堆的 Dijkstra 是 O((V+E)logV),邻接矩阵写法可能是 O(V²)。点边规模不同,最优实现也不同。

最后,题解要说明为什么算法适用。比起背出模板,能说清非负边权、不变量和复杂度,更能证明理解到位。

五、总结

图最短路评测要先判断边权、规模、查询类型和输出要求,再选择 Dijkstra、Bellman-Ford 或 Floyd。

Dijkstra 对了不代表场景对了。算法模板之前,先检查它的前提条件。

http://www.jsqmd.com/news/1132334/

相关文章:

  • [实例] SPI接口的ADC芯片全通道纯硬件驱动——基于HAL库和TLA2518芯片
  • 74LS73 异步计数器设计实战:2片芯片实现4位二进制与8421BCD电路对比
  • Claude Code的完美国产替代小米 MiMo Code安装指南
  • 前端应用的离线暂停更新策略:原理、实现与最佳实践
  • 星火插件:面向资深开发者的认知增强型IDE插件
  • [特殊字符] Git 协作指南
  • Recursive vs. Recurrent RNN 结构辨析:从链式到树状的3种建模范式
  • Vben精讲:06-Vben环境变量配置
  • VS code 连接 remote SSH 一些基本教程
  • CameraGraph™全域相机拓扑推理引擎 视频孪生跨镜目标连续追踪核心支撑 空间相机关系张量建模:根治跨镜头目标ID跳变、身份混淆底层算法拆解
  • 拯救开题困难户!Paperxm三步标准化,把“憋不出来”变成“一键生成”
  • 全域实景动态复刻,公安治安视频孪生快速溯源研判技术解析 跨辖区视频流时空融合 · 全域人员连续追踪管控 · 实景三维动态预警 · 城市安防一体化指挥底层全解
  • 2025反爬系统深度解析:从Canvas指纹到AI行为画像的攻防实战
  • ML预测半导体良品率——样本缺失值模式分析(Python+Pandas+Matplotlib)
  • Docker中文件修改的三种方法
  • 低代码平台与AI融合:从代码生成到智能开发的技术架构演进
  • 【硬件+APP+云平台】44.1.无线密码锁(PCB版)-基于STM32嵌入式物联网单片机软硬件毕业生系统设计
  • claude常用的cli
  • 想了解实力强的陕西GEO优化流程收费情况?这里有答案!
  • 我对NHibernate的感受(3):有些尴尬的集合支持
  • 三十多个 AI Agent,谁已经凉了
  • 立创EDA 原理图转PCB实战:3步完成转换并解决5类封装错误
  • WebPShop技术方案:Photoshop插件如何填补WebP动画与专业编码的市场空白
  • 曲面曲面解析求交方案-平面+曲面
  • AI Agent系统级测试:状态、链路与运行时质量保障
  • 征程 6 | 工具链 QAT ObserverBase 源码解析
  • 多相机画面割裂根治方案:MatrixFusion融合引擎核心原理详解
  • RevokeMsgPatcher:微信QQ防撤回补丁实用指南
  • 企业级低代码平台技术架构解析:从零代码搭建到异构系统深度集成
  • SST、SSR、SSE三要素:线性回归模型的误差解码指南