首页 > 其他分享 >最短路学习笔记

最短路学习笔记

时间:2024-02-13 14:33:26浏览次数:31  
标签:dist 短路 Dijkstra 笔记 SPFA 学习 算法 mathcal 节点

最短路学习笔记

单源最短路径问题(Single Source Shortest Path,SSSP问题)。

Part1 Dijkstra

Part1.0 Dijkstra 朴素算法

洛谷 P3371 【模板】单源最短路径(弱化版)

Dijkstra 算法

Dijkstra 算法的流程如下:

  1. 初始化 $dist[1]=0$,其余节点的 $dist$ 值为正无穷大。
  2. 找出一个未被标记的、 $dist[x]$ 的最小节点 $x$,然后标记节点$x$。
  3. 扫描节点 $x$ 的所有出边 $(x,y,z)$,若 $dist[y]>dist[x]+z$,则使用 $dist[x]+z$ 更新 $dist[y]$。
  4. 重复上述 2~3 两个步骤,知道所有节点都被标记。

Dijkstra 算法基于贪心思想,它只适用于所有边的长度都是非负数的图。Dijkstra 算法的时间复杂度为 $\mathcal{O}(n^2)$。

Part1.1 Dijkstra 堆优化

观察 Dijkstra 的流程,我们发现步骤2可以优化。

我们可以用堆对 $dist$ 数组进行维护,用 $\mathcal{O}(\log n)$ 的时间取出堆顶元素并删除,用 $\mathcal{O}(\log n)$ 的时间遍历每条边,总时间复杂度为 $\mathcal{O}((n+m) \log n)$。

Part2 Bellman-Ford & SPFA

Part2.0 Bellman-Ford算法

将所有边进行 $n-1$ 次松弛操作,在求解它的过程中,每次循环都要修改所有顶点对应的 $dist$ 数组的值,最短路径长度直到算法结束才能确定。算法的时间复杂度为:$\mathcal{O}(nm)$。

Part2.1 SPFA算法

SPFA 算法,即 Shortest Path Faster Algorithm,最短路径快速算法。

SPFA 算法在 Bellman-Ford 算法上进行了优化,将待更新的 $dist$ 数组的对应顶点存进队列里,每次取出队首元素 $u$,将与 $u$ 相连的节点进行松弛,如果节点 $y$ 不在队列里,且 $dis[y]$ 可以更新,那么将节点 $y$ 入队。

与 BFS 不同的是,SPFA 算法可以将一个节点多次入队。

SPFA 算法的时间复杂度为 $\mathcal{O}(km)$ ,其中 $k$ 是一个较小的常数。但是,如果题目数据故意卡 SPFA ,那么 SPFA 的时间复杂度会退化为 $\mathcal{O}(km)$。相较于 SPFA,Dijkstra 算法更为稳定。

标签:dist,短路,Dijkstra,笔记,SPFA,学习,算法,mathcal,节点
From: https://www.cnblogs.com/xiaoyukai/p/18014589

相关文章

  • Go语言精进之路读书笔记第24条——方法集合决定接口实现
    24.1方法集合方法决定接口实现:如果某个自定义类型T的方法集合是某个接口类型的方法集合的超集,那么就说类型T实现了该接口,并且类型T的变量可以赋值给该接口类型的变量Go语言规范,对于非接口类型的自定义类型T:类型T,方法集合由所有receiver为T类型的方法组成类型*T,方法集合由所......
  • Markdown 基本知识学习
    Markdown学习标题三级标题四级标题字体HELLOWORLD!HELLOWORLD!HELLOWORLD!HELLOWORLD!引用选择C4D制作动画,让创作更加简单分割线图片超链接[点击跳转到狂神博客](广告设计必备:Banner的涵义和设计专家建议!-哔哩哔哩(bilibili.com))列表ACABC......
  • 深度学习的始祖框架,grandfather级别的框架 —— Theano —— 示例代码学习(5)
    代码1:(求雅可比矩阵,jacobian矩阵求解)importtheanofromtheanoimporttensor#Creatingavectorx=tensor.dvector('x')#Creating'y'expressiony=(2*x**3)#ComputingderivativeOutput,updates=theano.scan(lambdai,y,x:tensor.g......
  • Markdown学习
    Markdown学习标题三级标题四级标题字体HELLOWORLD!HELLOWORLD!HELLOWORLD!HELLOWORLD!引用选择C4D制作动画,让创作更加简单分割线图片超链接[点击跳转到狂神博客](广告设计必备:Banner的涵义和设计专家建议!-哔哩哔哩(bilibili.com))列表ACABC......
  • Tacotron2(NVIDIA版)训练笔记
    https://blog.csdn.net/qq_44951010/article/details/124828260 Tacotron2项目地址:https://github.com/NVIDIA/tacotron2Tacotron2中文训练笔记:https://blog.csdn.net/qq_44951010/article/details/124830538从科大讯飞爬取音频数据:https://blog.csdn.net/qq_44951010/article/......
  • 凸包学习笔记
    凸包一般通过证明或观察出斜率有单调性于是可以用凸包维护。P5155[USACO18DEC]BalanceBeamP题意:有长为\(n\)的序列,每次等概率向左右移动一格,也可以结束并获得当前位置上的值,求每个位置的最大期望收益。思路:完全不懂期望!首先有一个结论,在\([0,L]\)上的\(x\)处,每次等概率向......
  • WQS二分学习笔记
    WQS二分WQS二分是一种可以处理一类带有限制的问题的方法,这种限制一般是恰好选\(k\)个的形式,而且要求原问题有凸性。比如函数是上凸的,那么斜率就递减,如果我们去二分这个斜率,那么可以快速求出切点,而切点横坐标代表我们选择了多少个,于是我们就可以根据这个数目和题中要求的\(k\)......
  • Go语言精进之路读书笔记第23条——理解方法的本质以选择正确的receiver类型
    和函数相比,Go语言中的方法在声明形式上仅仅多了一个参数,Go称之为receiver参数。receiver参数是方法与类型之间的纽带。Go方法特点:方法名的首字母是否大写决定了该方法是不是导出方法。方法定义要与类型定义放在同一个包内。由此可以推出,不能为原生类型(如int/float64/map等)添加......
  • 根号分治学习笔记
    根号分治根号分治其实一般是广义上的阈值分治,当范围不超过\(B\)时用一种方法,超过\(B\)时用另一种做法。之所以叫根号分治主要是大部分的应用都是在和一定时,不超过\(\sqrt{n}\)的可以把所有\(1\sim\sqrt{n}\)的都处理,超过\(\sqrt{n}\)的最多只有\(O(\sqrt{n})\)个,也......
  • 点分治学习笔记
    点分治点分治是一种处理树上路径问题的常见方法。先引入例题。求树上有多少条路径的长度是3的倍数。点分治的过程是每次找到当前联通块的重心,然后处理所有跨过重心的路径,然后删去重心,递归每个子树再进行处理。根据重心的性质,重心的每个儿子的子树大小都不超过\(\dfrac{n}{......