1. 题目背景与需求分析单源最短路径Single-Source Shortest PathSSSP是图论中的经典问题也是算法竞赛中的高频考点。洛谷P3371作为该问题的模板题主要考察对Dijkstra算法或SPFA算法的实现能力。题目给定一个包含n个顶点、m条边的有向图要求计算从源点s到所有其他顶点的最短路径长度。在实际应用中最短路径算法广泛存在于交通导航系统中的路线规划网络路由协议的路径选择物流配送中的最优路径计算游戏AI中的寻路算法注意本题特别标注为弱化版意味着测试数据不包含负权边因此使用Dijkstra算法更为合适。若存在负权边则需要考虑SPFA或Bellman-Ford算法。2. 算法选型与复杂度分析2.1 Dijkstra算法原理Dijkstra算法的核心思想是贪心策略通过维护一个未确定最短路径的顶点集合每次从中选取当前距离源点最近的顶点进行松弛操作。其正确性基于以下关键点非负权边保证局部最优即全局最优每次松弛操作不会使已确定最短路径的顶点距离变小算法伪代码表示def dijkstra(graph, source): dist [INF] * n dist[source] 0 visited set() heap MinHeap() heap.push((0, source)) while heap: current_dist, u heap.pop() if u in visited: continue visited.add(u) for v, weight in graph[u]: if dist[v] current_dist weight: dist[v] current_dist weight heap.push((dist[v], v)) return dist2.2 复杂度对比算法时间复杂度空间复杂度适用场景Dijkstra(堆)O((VE)logV)O(VE)无负权边SPFA平均O(E)最坏O(VE)O(VE)含负权边无负环Bellman-FordO(VE)O(VE)含负权边可检测负环对于本题n≤10^4的数据规模使用堆优化的Dijkstra算法更为稳妥可以保证在时限内完成计算。3. 代码实现细节3.1 数据结构设计采用邻接表存储图结构更节省空间vectorvectorpairint, int graph(n1); // 邻接表graph[u] { (v1,w1), (v2,w2)... }优先队列需要自定义比较函数struct Node { int id, dist; bool operator(const Node other) const { return dist other.dist; } }; priority_queueNode, vectorNode, greaterNode pq;3.2 完整实现代码#include iostream #include vector #include queue #include climits using namespace std; const int INF INT_MAX; void dijkstra(int n, int s, vectorvectorpairint,int graph, vectorint dist) { dist.assign(n1, INF); dist[s] 0; priority_queuepairint,int, vectorpairint,int, greaterpairint,int pq; pq.push({0, s}); while (!pq.empty()) { auto [d, u] pq.top(); pq.pop(); if (d dist[u]) continue; for (auto [v, w] : graph[u]) { if (dist[v] dist[u] w) { dist[v] dist[u] w; pq.push({dist[v], v}); } } } } int main() { int n, m, s; cin n m s; vectorvectorpairint,int graph(n1); for (int i 0; i m; i) { int u, v, w; cin u v w; graph[u].emplace_back(v, w); } vectorint dist(n1); dijkstra(n, s, graph, dist); for (int i 1; i n; i) { cout (dist[i] INF ? 2147483647 : dist[i]) ; } return 0; }3.3 关键优化点延迟删除技术优先队列中可能存在同一节点的多个副本通过if (d dist[u]) continue跳过过期数据邻接表存储相比邻接矩阵稀疏图下空间复杂度从O(V^2)降至O(VE)STL优先队列使用greaterpairint,int实现最小堆避免手写堆结构4. 常见问题与调试技巧4.1 典型错误案例未初始化距离数组// 错误写法 vectorint dist; // 未初始化大小和初值 // 正确写法 vectorint dist(n1, INF);优先队列比较函数错误// 错误写法 - 比较方向反了 priority_queuepairint,int pq; // 默认最大堆 // 正确写法 priority_queuepairint,int, vectorpairint,int, greaterpairint,int pq;整数溢出处理// 错误写法 - 未考虑边权累加溢出 if (dist[v] dist[u] w) // 当dist[u]w超过INT_MAX时溢出 // 正确写法 - 增加溢出判断 if (dist[u] ! INF dist[v] dist[u] w)4.2 测试用例设计设计测试用例时应考虑以下边界情况单顶点图n1链式图所有顶点形成一条链完全图任意两顶点间都有边源点无法到达某些顶点的情况多条平行边同一对顶点间有多条不同权值的边示例测试数据// 情况4顶点4不可达 4 3 1 1 2 5 2 3 3 1 3 9 // 预期输出0 5 8 21474836475. 算法扩展与变种5.1 路径记录如需输出具体路径而不仅是距离可增加pre数组记录前驱节点vectorint pre(n1, -1); // 松弛时更新前驱 if (dist[v] dist[u] w) { dist[v] dist[u] w; pre[v] u; pq.push({dist[v], v}); } // 输出路径 void print_path(int v) { if (v -1) return; print_path(pre[v]); cout v ; }5.2 多源最短路径对于需要计算所有顶点对之间最短路径的场景可采用Floyd-Warshall算法O(V^3)对每个顶点运行DijkstraO(V(EVlogV))5.3 双标准最短路径当需要考虑路径长度和边权之外的其他因素如费用、舒适度时可将优先队列元素扩展为多元组struct State { int id; int dist; int cost; bool operator(const State other) const { return dist other.dist ? cost other.cost : dist other.dist; } };在实际编码竞赛中建议将Dijkstra算法封装为可重用模板。我个人的实现习惯会包含以下特性支持邻接表和邻接矩阵两种存储方式可配置是否记录路径包含防溢出处理使用更高效的配对堆pb_ds库替代STL优先队列对于时间要求特别严格的题目还可以尝试以下优化使用手写堆替代STL优先队列在已知图结构的情况下使用Dial算法当边权为小整数时使用位运算优化比较操作
企业数字化 ERP 产品动态
相关推荐
Z-BlogPHP免登陆发布插件:API鉴权与自动化发布实战 1. 先把场景说透:免登陆发布到底在解决什么问题做站久了的人都有一个共同的疲惫感:后台编辑器打开、标题粘进去、正文粘进去、摘要再手敲一遍、标签一个个敲、分类下拉框选一下、封面图重新上传、发布时间手动调……一篇文章发下来,手指在鼠标和键盘之间来回跳了十几趟。如果只… · 2026/11/5 8:34:15
预期功能安全SOTIF:无故障车辆为何仍会撞人? 简介:面向智能网联汽车功能安全从业者、系统与软件工程师及高校相关专业学习者,这份资料提供预期功能安全(SOTIF)领域的核心标准文本,重点解决自动驾驶与辅助驾驶系统在无故障情况下因性能局限、感知偏差和算法约束而引… · 2026/11/5 8:33:14
智能驾驶中的鸟瞰视角(BEV)技术解析与应用实践 1. 鸟瞰视角在智能驾驶中的核心价值在智能驾驶系统中,鸟瞰视角(BEV,Birds Eye View)技术正逐渐成为环境感知的关键组成部分。与传统的前视或环视摄像头相比,鸟瞰视角通过将多个摄像头的图像拼接并投影到俯视平面&#… · 2026/11/5 8:33:14
易飞ERP WebAPI审核接口设计与实现 1. 项目背景与核心价值在企业资源计划(ERP)系统中,单据审核流程是业务流转的核心环节。传统ERP系统通常需要审核员登录桌面客户端进行操作,这种模式在移动办公场景下存在明显局限性。易飞ERP通过开放WebAPI接口实现全单据类型的审… · 2026/11/5 8:36:16
1688商品评论API实战:高效获取电商数据 1. 项目背景与核心价值 在电商数据分析和竞品调研工作中,获取真实商品评论数据是至关重要的一环。1688作为国内领先的B2B平台,其商品评论数据蕴含着采购商反馈、产品质量评估、供应链表现等宝贵信息。传统爬虫方式不仅效率低下,还面临反爬机制… · 2026/11/5 8:36:16
开源表格引擎Univer:嵌入式协同、Canvas渲染与工程实践 说个比较直接的判断:如果做 Web 端的在线文档,或者想在自家产品里塞一个具备协同能力的表格,这两年值得认真看一眼的开源引擎,Univer 应该算一个。Univer 是 TypeScript 写的开源表格引擎,跟传统那种“打开即用的在线 … · 2026/11/5 8:36:16
Univer开源办公表格套件:从Canvas渲染到生产级集成实践 最近在给我们内部的数据分析平台做表格模块,需求一条比一条硬:要能在线编辑、要能渲染几万行不卡、要支持公式和透视表,还得方便后续做协同。我在这个赛道上把能试的开源方案基本试了个遍,最后留下了 univer,并且已经把… · 2026/11/5 8:36:16
5G NR-PRS在6G ISAC混合场景定位中的应用与优化 1. 项目概述与背景 在6G通信系统的演进过程中,集成感知与通信(ISAC)技术正成为关键研究方向。5G新空口定位参考信号(NR-PRS)作为现有5G网络中的成熟定位方案,其技术优势为6G多基地ISAC系统提供了重要支撑。… · 2026/11/5 8:36:16
移动应用性能评测:指标构建与优化实践 1. 移动应用性能评测的行业现状 最近三年,国内移动应用月活用户增速已降至5%以下,但用户对应用性能的要求却越来越高。某第三方数据显示,2022年用户卸载应用的三大原因中,"卡顿闪退"占比达37%,仅次于"广… · 2026/11/5 8:35:15
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38