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

【算法】小白也能懂 · 第 15 节:最短路径算法(Dijkstra)

上一节我们学习了并查集,它擅长处理「连通性」问题——判断两个节点是否属于同一个集合。但现实世界中,我们经常遇到另一类问题:从 A 点到 B 点,哪条路最近?这就是今天要讲的最短路径问题,以及解决它的经典算法——Dijkstra(迪杰斯特拉)算法

1. 什么是最短路径问题

1.1 一个生活中的例子

想象你打开手机地图导航,输入起点和终点。地图 App 会在几秒内告诉你最优路线——这就是最短路径算法在背后工作。

在计算机科学中,最短路径问题可以这样描述:

给定一个带权图(每条边有一个权重,比如距离或时间),找到从某个起点到其他所有节点的最短路径。

1.2 最短路径问题的分类

类型说明适用算法
单源最短路径从一个起点到所有其他点Dijkstra、Bellman-Ford
全源最短路径所有点对之间的最短路径Floyd-Warshall
无权图最短路径所有边权重相同BFS 即可
带权图最短路径边权重不同Dijkstra、Bellman-Ford

Dijkstra 算法解决的是单源最短路径问题,且要求所有边的权重为非负数

2. Dijkstra 算法的核心思想

2.1 贪心策略

Dijkstra 算法的核心思想是贪心:每次从「还没访问过的节点」中,选择距离起点最近的那个,然后用它去更新邻居的距离。

用一个类比来理解:

  1. 你在起点,知道到自己的距离是 0
  2. 看看所有邻居,更新它们到起点的距离
  3. 选出距离最近且还没「确定」的节点,标记为「已确定」
  4. 用这个节点去更新它的邻居
  5. 重复步骤 3-4,直到所有节点都确定

这就像「涟漪扩散」——从起点出发,一圈一圈向外扩展,每一圈都确定一个最近的节点。

2.2 松弛操作(Relaxation)

Dijkstra 的核心操作叫松弛(Relaxation)。对于一条边 (u, v),权重为 w:

如果dist[u] + w < dist[v],就更新dist[v] = dist[u] + w

意思是:如果通过 u 到达 v 比之前的路径更短,就更新 v 的最短距离。

3. 算法步骤详解

我们用一个小图来演示 Dijkstra 的执行过程:

2 A -------> B | | 4 | | 1 | | v v C -------> D 3

起点为 A,求 A 到所有节点的最短距离。

第 1 步:初始化

节点dist已确定?
A0
B
C
D

第 2 步:用 A 更新邻居

A 的邻居是 B(距离 2)和 C(距离 4)。

节点dist已确定?
A0
B2
C4
D

第 3 步:选出最近的未确定节点 B,标记为已确定

用 B 更新邻居:B 到 D 的距离是 2 + 1 = 3。

节点dist已确定?
A0
B2
C4
D3

第 4 步:选出最近的未确定节点 D,标记为已确定

D 没有未确定的邻居需要更新。

节点dist已确定?
A0
B2
C4
D3

第 5 步:选出 C,全部完成

节点dist已确定?
A0
B2
C4
D3

最终结果:A 到 B 最短距离 2,到 C 最短距离 4,到 D 最短距离 3。

4. 代码实现

4.1 数据结构选择

为了高效地「选出距离最近的未确定节点」,我们使用优先队列(最小堆)。这样每次取最近节点的操作是 O(log N),而不是遍历所有节点的 O(N)。

图的存储使用邻接表,适合稀疏图。

4.2 C++ 完整代码

#include<iostream>#include<vector>#include<queue>#include<climits>usingnamespacestd;// 边的结构:目标节点 + 权重structEdge{intto,weight;};// Dijkstra 算法vector<int>dijkstra(intn,intstart,vector<vector<Edge>>&graph){vector<int>dist(n,INT_MAX)
http://www.jsqmd.com/news/874062/

相关文章:

  • 终极指南:如何用命令行高效管理你的百度网盘文件
  • 有哪些真正好用的降AIGC软件?能同时符合论文规范和压低AIGC数值的那种
  • 为什么顶尖团队禁用Claude自动生成微服务?(内部泄露的5条红线规则与替代性增强方案)
  • 软考软件设计师·考前6天·最后冲刺全攻略
  • 2026年扬州油漆全屋定制厂家权威排行实测盘点:扬州全屋定制工厂哪家靠谱/扬州可立夫全屋定制工厂/扬州定制衣柜橱柜/选择指南 - 优质品牌商家
  • ComfyUI Manager 终极安装指南:3种方法轻松管理AI工作流节点
  • 如何用Python自动挂号脚本告别手动抢号烦恼:完整实战教程
  • 设计模式 之 责任链模式
  • Kubernetes自定义资源:扩展Kubernetes API的能力
  • 机器学习篇---图像分割
  • 2026年5月充电桩建站厂家推荐:十大排名重卡快充评测专业价格 - 品牌推荐
  • 【无人机路径规划】实现有效的水陆两栖无人机任务规划和执行(Matlab实现)(含粒子群优化和遗传算法)
  • AI Agent如何重构咨询交付模式:从人工周级报告到秒级洞察,头部咨询公司内部流程解密
  • 智能是使用者的镜像·维度扩展版|权重不是结果,是你看不见的那一堆因素算出来的
  • 【GUI】正交频分复用(OFDM) 峰均功率比(PAPR)降低仿真器:使用选择映射(SLM)和部分传输序列(PTS)研究(Matlab代码实现)
  • 2026年石家庄金属回收TOP5推荐:石家庄废品回收、石家庄高价回收金属、石家庄高价回收铜铁铝电缆废品、设备回收选择指南 - 优质品牌商家
  • AI 开发工具选择指南:Qoder、Qwen 与开发者使用策略
  • ML模型监控工具:监控和维护机器学习模型的性能
  • 还搞不懂集合?一张图带你吃透 ArrayList、HashMap、ConcurrentHashMap 的底层原理(附7张流程图)
  • 工具要工程化。
  • Codeforces Round 1057
  • 深度学习篇---图像分类、目标检测和图像分割任务对比
  • 多云安全态势:管理多个云环境的安全状态
  • 哪家工控一体机厂家专业?2026年5月推荐TOP5对比案例防尘防震评测特点 - 品牌推荐
  • 软考软件设计师 · 考前5天终极精炼
  • 211本科985硕拿下淘天AI二面!全程无代码,这面试题火了!
  • 2026年第二季度,如何甄选一家可靠的山地车制造合作伙伴? - 2026年企业推荐榜
  • Invoke-Obfuscation深度解析:PowerShell混淆技术的实战指南与防御策略
  • 畜牧场景电加热风机技术拆解与选型实操指南:养鸭专用风机/农业机械/农牧机械设备/冷风机/厂房降温风机/商品鸡平养自动料线/选择指南 - 优质品牌商家
  • 前端全流程求职Skill 攻略