关于图论【最短路径之Dijkstra算法(堆优化版)|卡码网47.参加科学大会的思考】

目录

一、本题题目

二、本题代码

三、关键思路

四、注意事项

五、图论角度

六、Dijkstra算法的两种版本求最短路径的区别

七、为什么要用这个堆优化版

八、自我感觉


一、本题题目

// 展示完整题目

二、本题代码

// 展示完整代码

三、关键思路

1、用小顶堆优化,用邻接表存储

2、三步走

// 找距离源点最近的且未访问过的节点

// 标记已访问过的

// 更新未访问过的节点到源点的最短路径

四、注意事项

1、关于各种加入操作(C++语法)

// 数组用push_back()

// 队列、栈、优先级队列用push()

// 集合和map映射用insert()

2、operator()这是一个整体的函数调用运算符

3、如果代码里要显式调用构造函数,结构体里面要写出来

4、顶点编号是从1开始的,初始化起点的时候要注意初始化的是1

// 不是0

5、获取优先级队列的队头的时候要注意,要用一个数值对来接收

6.如果有问题要写调试代码段

7.这个版本的代码有很多变量、结构体、数组之类的,各种含义要搞清楚

// 比如cur的含义是当前遍历到的距离源点最近的且未访问过的节点数值对

// cur.first的含义是当前遍历到的距离源点最近的且未访问过的节点编号

五、图论角度

1、点的角度(例如:Prim算法求最小生成树,Dijkstra算法求最短路径)

2、边的角度(例如:Kruskal算法求最小生成树,堆优化版的Dijkstra算法求最短路径)

六、Dijkstra算法的两种版本求最短路径的区别

1、Dijkstra朴素版

【循环 + 邻接矩阵】

2、Dijkstra堆优化版

【小顶堆 + 邻接表】

// C++里面实现小顶堆用的是优先级队列

// 优先级队列可以自定义小顶堆/大顶堆

七、为什么要用这个堆优化版

时间复杂度更低

八、自我感觉

1、比朴素版的复杂,但是效率更好。果然好东西都是不那么容易拿到的。

2、小顶堆的相关操作有待提升,每次要写小顶堆的东西的时候,都重新自己写一遍

3、两种版本的时间复杂度

朴素版的时间复杂度是O(

堆优化版的时间复杂度是O(eloge) // e是边的数量,有log是因为用堆排序的时候会出现log

相关推荐
有点。2 小时前
C++03阶段练习(练习题)
数据结构·算法·图论
周末也要写八哥3 小时前
经典算法实例:游戏中弱角色的数量(二)
算法
是Yu欸3 小时前
鸿蒙PC移植:2048 从网页小游戏到 AI 桌面应用
大数据·人工智能·算法·数据挖掘·openharmony·codex
鹿角片ljp3 小时前
KV Cache 解析
java·算法
liliangcsdn4 小时前
IVOL与偏度因子的对比测量分析
算法
threerocks5 小时前
Jev 入门第一课
算法
西柚研究生1234566 小时前
论文分析17:YOLOv11_UAVNet:无人机航拍图像专用目标检测算法
人工智能·python·深度学习·算法·目标检测
hetao17338376 小时前
2026-09-17 hetao1733837 的刷题记录
c++·算法
午彦琳7 小时前
2026.9.17
数据结构·算法·leetcode
木井巳8 小时前
【记忆化搜索】不同路径
java·算法·leetcode·深度优先·剪枝·推荐算法