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

图论天花板:Dijkstra最短路径算法详解

一、上期回顾 Day30

掌握图论基础、邻接表、拓扑排序,解决任务依赖、有向图判环、课程排序问题。今天学习图论天花板级高频考点Dijkstra 单源最短路径算法


二、Dijkstra 算法核心概念

1. 解决什么问题

给定带权有向 / 无向图,求一个起点其他所有点最短路径

  • 权值:距离、时间、花费
  • 适用:边权非负(没有负数权值)

2. 核心思想(贪心)

  1. 每次选离起点最近未访问的点
  2. 用这个点松弛(更新)它邻居的距离
  3. 标记已访问,不再重复处理
  4. 直到所有点处理完毕

三、必备数据结构

  1. 邻接表:存图(比邻接矩阵高效)
    vector<pair<int, int>> edge[N]; // edge[u] = {v, w} 从u到v,边权w
  2. 距离数组 dist []dist[i]起点到 i 点的最短距离
  3. 访问数组 vis []:标记已确定最短路径的点
  4. 优先队列(堆):堆优化,O (E log V),效率爆炸

四、堆优化 Dijkstra 万能模板(必背)

#include <iostream> #include <vector> #include <queue> #include <climits> using namespace std; const int N = 10005; vector<pair<int, int>> edge[N]; // 邻接表:to, weight int dist[N]; // 最短距离 bool vis[N]; // 访问标记 int n, m; // 点数,边数 // Dijkstra 堆优化版 void dijkstra(int start) { // 初始化距离为无穷大 fill(dist, dist + N, INT_MAX); fill(vis, vis + N, false); dist[start] = 0; // 优先队列:小根堆(距离最小优先) // pair<int, int>:{距离,节点编号} priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; pq.push({0, start}); while (!pq.empty()) { auto [d, u] = pq.top(); pq.pop(); if (vis[u]) continue; // 已处理跳过 vis[u] = true; // 遍历所有邻居 for (auto [v, w] : edge[u]) { if (!vis[v] && dist[v] > d + w) { dist[v] = d + w; pq.push({dist[v], v}); } } } } int main() { cin >> n >> m; for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; edge[u].emplace_back(v, w); // 无向图再加一行 edge[v].emplace_back(u, w); } dijkstra(1); // 从1号点出发 // 输出到所有点的最短距离 for (int i = 1; i <= n; i++) cout << dist[i] << " "; return 0; }

五、关键步骤拆解

  1. 初始化:起点距离 = 0,其余无穷大
  2. 小根堆:每次拿最近点
  3. 松弛操作
    if (dist[v] > dist[u] + w) dist[v] = dist[u] + w;
  4. 标记访问:每个点只处理一次,保证效率

六、适用场景

  1. 地图导航最短路径
  2. 网络传输最小延迟
  3. 工程最小花费
  4. 带权图单源最短路(无负权

七、易错点提醒

  1. 必须用小根堆(greater),不能用默认大根堆
  2. 边权不能为负数,否则失效
  3. 无向图 = 双向加边
  4. 距离数组初始化为极大值

八、今日核心总结

  1. Dijkstra =贪心 + 堆优化 + 松弛操作
  2. 解决带权图单源最短路径
  3. 邻接表存图,小根堆提速
  4. 时间复杂度O(E log V),刷题首选
  5. 边权不能为负

九、课后练习

  1. 手写堆优化 Dijkstra 模板
  2. 构造简单带权图,求起点到各点最短路
  3. 尝试无向图写法
http://www.jsqmd.com/news/892154/

相关文章:

  • 大模型面试必看!Agent服务高可用架构深度解析(附实战案例)
  • 化工模拟必备!Aspen Plus V15安装教程
  • Taotoken支持Qwen等旗舰模型首发且价格实惠的接入体验
  • 如何让老旧Mac焕发新生:OCLP-Mod完整指南与实用技巧
  • 2026年4月徐汇区有实力的宠物体检专家推荐,猫咪心脏/狗狗黑色素瘤/猫咪骨肉瘤/猫咪乳腺肿瘤,宠物体检医生选哪个 - 品牌推荐师
  • 告别Apex Legends后坐力困扰:5分钟配置智能压枪宏,轻松提升射击精度
  • 应急响应——Web服务日志分析
  • 知识图谱补全新范式:融合语义与结构的ISA-KGC框架解析
  • 三步打造专属Windows系统优化方案:Winhance中文版终极指南
  • 【元胞自动机】基于matlab元胞自动机的短信网络病毒传播模拟【含Matlab源码 15565期】
  • wechat-article-exporter:微信公众号文章批量下载工具
  • Cats Blender插件终极指南:VRChat模型优化的完整解决方案
  • 邮政与商业快递成本分化之后跨境卖家如何重选发货通道
  • 【元胞自动机】基于matlab元胞自动机实现高速公路收费站【含Matlab源码 15566期】
  • 宇树GO2机器人ROS2 SDK:从零开始构建智能四足机器人控制系统的完整指南
  • 一个真正“隐私友好”的 AVIF 转 JPG 在线工具(无需上传文件)
  • C++知识点复习(面向面试6)
  • PP 蜂窝板回料利用与成本控制的工程化方案
  • ICT-META:基于上下文学习的加密流量少样本分类模型实践
  • 从零开始构建豆瓣Top250电影爬虫:完整教程与反爬虫实战
  • ChatGPT插件安装实操手册(2024最新版):OpenAI官方未公开的3个关键验证步骤与绕过限制技巧
  • DFS岛屿问题:核心思想与实战模板
  • Vite Tree Shaking 实战笔记
  • RK3576上electron调用GPU的功能设置方法
  • 避坑指南:大模型权重跨机传输遭遇 Broken pipe、密码错位与断点续传终极解决方案
  • 4D-STEM数据革命:py4DSTEM如何重塑材料科学分析范式
  • NAVSIM数据驱动仿真平台
  • ARM架构SError异常机制与RAS特性解析
  • pandas数据处理实战:从环境搭建到清洗分析全流程
  • 【飞机】基于matlab自主无人机飞行稳定和轨迹跟踪【含Matlab源码 15569期】