之前说,这星期想要结束掉acwing上算法基础课的图论与数学知识两个章节,所以今天来整理一下最近学的dijkstra算法,文中部分图片取自acwing。其中的每一个算法我都会附上acwing中对应的模板题目,大家也可以去那边熟悉一下模板的写法
前言
大家好啊,这里是幸麟
🧩 一名普通的大学牲,最近在学算法
🧩本文栏目:幸麟同学的算法笔记
🧩希望我的笔记对你算法学习有一些帮助
🧩如果有错误欢迎各位同学批评指正
目录
算法介绍
1.什么是dijkstra算法
迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。
同时dijkstra算法主要用于解决单源最短路问题(边权为正数),其可以分为两种版本,两种版本各有用处,并不存在好坏之分,接下来我们用n代表点的数量,用m代表边的数量
朴素版本dijkstra 时间复杂度 O(n^2) 用于解决稠密图
堆优化dijkstra 时间复杂度O(mlogn) 用于解决稀疏图
可能这里有同学会问,什么是稀疏图,什么是稠密图
这里解答一下,稀疏图指的是图中边的数量远远小于点的数量,稠密图反之,边的数量远远大于点的数量
当然具体的我们也可以用时间复杂度来判断到底是运用哪一种算法
如果你不太了解时间复杂度是什么可以来看看下面这篇文章
(图源自acwing)

朴素版本dijkstra
首先我们来介绍一下朴素版本的dijkstra
该算法主要用于点远远小于边的稠密图中
模板题链接:849. Dijkstra求最短路 I
题目图片(图中便是一个稠密图)
算法中主要的步骤
在此题中
我们可以运用dijkstra算法,主要的步骤有下面几步
①遍历每一个点,找到一个第一次被遍历的,距离1号点最近的一个点,我们把这个点的编号记为t
②运用t点去尝试更新1到其他点的距离
尝试更新的大致操作
假设我们有一条边,这个边的起点是t,终点是b,这条边有一个边权
如果点t到1号点的位置+边权<点b到1号点的距离,那么我们就把1号点到b的距离更新成更小的值
dist[t]+边权<dist[b],我们就更新dist[b]==dist[t]+边权
③继续遍历其他没有被遍历过的点
我自己做了个动图,这样看起来更加直观一些,如果觉得快的话可以在下面找到逐张的图
(抱歉啊,因为不太熟悉软件就只能自己一张一张画出来,画的不太好,不知道有没有小伙伴知道比较好的作图软件,如果有的话,希望可以在评论区或者私信分享一下,谢谢你了)

各个部分的代码
接下来是代码实现
由于是稠密图,点的数量只有不到500,所以采用邻接矩阵p来存储各点到其他点的距离
例如p[1][2]存储的就是1号点到2号点的距离
#incl

本文是作者幸麟关于Dijkstra算法的学习笔记,详细介绍了算法的基本思想和步骤,包括朴素版本和堆优化版本。文章通过实例解释了算法在稠密图和稀疏图中的应用,并提供了相应的代码实现。同时,文章还提到了时间复杂度的概念,帮助读者理解不同版本Dijkstra算法的适用场景。
&spm=1001.2101.3001.5002&articleId=128670318&d=1&t=3&u=6d844209b04544e08f30607e983bf802)
2270

被折叠的 条评论
为什么被折叠?



