关于图论【最短路径之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

相关推荐
坚持编程的菜鸟1 小时前
编写判断大小端程序
c语言·算法·判断大小端
papaofdoudou1 小时前
判断排列逆序奇偶性的乘积判别法(范德蒙德符号法)
人工智能·算法
linux-hzh2 小时前
百日算法修炼 · Day 03
java·算法
嵌入式老牛3 小时前
三相电气量采集模块设计(三)非同步采样时的精度提升
算法·精度·计量
今天AI了吗4 小时前
精细化落地教程:TimechoAI调参标准+数据清洗规范+误差归因+阈值适配全维度指南
大数据·人工智能·算法
zephyr055 小时前
从递归到迭代:二叉树非递归前中后序遍历详解
算法
Dr.kangder5 小时前
嵌入式总线设备解析——TTE总线应用与实践
开发语言·网络·算法·嵌入式·多任务·同步机制
Hi李耶5 小时前
【LeetCode】557.反转字符串中的单词 III
算法·leetcode·职场和发展
yyy(十一月限定版)5 小时前
016【入门】双端队列
数据结构·c++