当前位置: 首页 > 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.gsyq.cn/news/1395415.html

相关文章:

  • 化工模拟必备!Aspen Plus V15安装教程
  • 无监督域适应:用合成数据训练6D姿态估计模型的实战指南
  • ESOMICS:基于机器学习的WCET优化,提升混合关键性系统性能
  • Python-CAN实战:从零构建一个CAN总线数据监控与分析工具
  • wechat-article-exporter:微信公众号文章批量下载工具
  • 从零开始构建豆瓣Top250电影爬虫:完整教程与反爬虫实战
  • ICT-META:基于上下文学习的加密流量少样本分类模型实践
  • 2025年营收10亿,暖哇科技冲刺港股IPO
  • ESP8266-AT固件刷写避坑指南:从固件选择到一次烧录成功
  • ChatGPT插件安装实操手册(2024最新版):OpenAI官方未公开的3个关键验证步骤与绕过限制技巧
  • RK3576上electron调用GPU的功能设置方法
  • 4D-STEM数据革命:py4DSTEM如何重塑材料科学分析范式
  • 多目标进化算法如何攻克非规则Pareto前沿?动态资源分配是关键
  • 【飞机】基于matlab自主无人机飞行稳定和轨迹跟踪【含Matlab源码 15569期】
  • 个人助理工作流重构
  • TimeGate:时序知识图谱表示学习新范式,统一编码时间与结构信息
  • 如何高效使用Kohya_SS:稳定扩散模型训练实战指南
  • MK60DN512VLL10 芯片解密详解
  • Kafka踩过的那些坑:分区副本、ISR抖动、消费位移,这些细节决定系统稳不稳!
  • 2026年好用的AI论文平台推荐
  • 企业内如何通过API Key管理与审计日志功能规范AI资源使用
  • FedBEVT:破解自动驾驶BEV感知联邦学习中的数据异构难题
  • ChatGPT图片识别功能全解密(工程师内部测试报告·限阅版):支持OCR/图表解析/手写体识别,但不支持实时视频流?
  • 生物医学信号复杂度分析:从算法原理到嵌入式硬件部署实战
  • Python实战:打通海康威视iSecureCenter平台AK/SK签名认证全流程
  • ChatGPT插件安装不求人:手把手带你在Windows/macOS/Linux三端完成Docker化插件托管(含YAML配置审计表)
  • AI落地方法论
  • ChatGPT教育版免费升级失败?92.6%申请人忽略的3个隐藏资格门槛(含K12教师/在读硕博/交换生专属路径)
  • 财税服务系统技术选型:从记账合规到智能风控的3层架构设计实战
  • 医院数智化转型:医院“标配”AI 推进全民健康数智化