Acwing算法笔记:求解最短路问题1(详细介绍朴素版和堆优化dijkstra算法,建议收藏)

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

之前说,这星期想要结束掉acwing上算法基础课的图论与数学知识两个章节,所以今天来整理一下最近学的dijkstra算法,文中部分图片取自acwing。其中的每一个算法我都会附上acwing中对应的模板题目,大家也可以去那边熟悉一下模板的写法

 前言 

大家好啊,这里是幸麟

🧩 一名普通的大学牲,最近在学算法

🧩本文栏目:幸麟同学的算法笔记

🧩希望我的笔记对你算法学习有一些帮助

🧩如果有错误欢迎各位同学批评指正

目录

算法介绍

朴素版本dijkstra 

 算法中主要的步骤

 各个部分的代码

逐张图解析算法过程

完整代码

堆优化dijkstra算法

算法中的主要步骤

各个部分的代码

完整代码


算法介绍

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
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸麟同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值