关于图论【最短路径之Dijkstra算法(堆优化版)|卡码网47.参加科学大会的思考】
2026/8/8 16:00:01 网站建设 项目流程

目录

一、本题题目

二、本题代码

三、关键思路

四、注意事项

五、图论角度

六、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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询