最短路总结

Posted V-sama

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路总结相关的知识,希望对你有一定的参考价值。

单源最短路

Bellman-Ford SPFA Dijkstra H-Dijkstra
思路 遍历全边,直到不变 宽搜渐进,入队再更 找最近点,更新邻点,找完不再用 取负入队,大根堆找点,其余相同
负边权
判负环
时间复杂度 O(nm) O(km~nm) O(m+n^2) O(mlogn)
适用于 为什么不用SPFA 稀疏图 还是优化吧 非负边权
链接 https://www.cnblogs.com/V-sama/p/17422894.html https://www.cnblogs.com/V-sama/p/17426721.html https://www.cnblogs.com/V-sama/p/17426750.html https://www.cnblogs.com/V-sama/p/17426844.html

基本上是H-Dijkstra>Dijkstra>SPFA>Bell-Ford

多源最短路

Floyed H-Dijkstra Johnson
思路 动规三重循环 n次Dijkstra 虚拟结点,映射非负,H-Dijkstra
负边权
判负环
时间复杂度 O(n^3) O(nmlogn) O(nm+nmlogn)
适用于 稠密图 非负边权 稀疏图
链接 https://www.cnblogs.com/V-sama/p/17429313.html https://www.cnblogs.com/V-sama/p/17426844.html https://www.cnblogs.com/V-sama/p/17429389.html

最短路问题常用算法总结和模板

1.Dijkstra 算法

      Dijkstra算法适用于边权为正的情况。

      用于计算正权图上的单源最短路(Single-Source Shortest Paths,SSSP)。所谓单源最短路即从单个源点出发,到所有结点的最短路。

      算法同时适用于有向图和无向图。

     伪代码:

    

 1 清除所有点的标点(有的话)
 2 设d[0]=0,其他d[i]=INF
 3 循环n次{
 4     在所有未标号结点中,选出d的最小的结点x
 5     给结点x标号
 6     对于从x出发的所有边(x,y),更新d[y]=min{d[y],d[x]+w[x][y]]}
 7 }
 8 //程序
 9 memset(v,0,sizeof(v));
10 for(int i=0;i<n;i++) d[i]=(i==0?0:INF);
11 for(int i=0;i<n;i++) {
12     int x,m=INF;
13     for(int y=0;y<n;y++) if(!v[y]&&d[y]<=m) m=d[x=y];
14     v[x]=1;
15     for(int y=0;y<n;y++) d[y]=min(d[y],d[x]+w[x][y]);
16 }
17 //路径打印==动态规划方案打印
18 if(d[y]>d[x]+w[x][y]) {
19     d[x]=d[x]+w[x][y];
20     fa[y]=x;
21 }//替换d[y]=min(d[y],d[x]+w[x][y]),边的松弛操作

 

以上是关于最短路总结的主要内容,如果未能解决你的问题,请参考以下文章

最短路总结

最短路问题常用算法总结和模板

leetcode之最短路刷题总结1

总结梳理|关于“最短路径”的十二个基本问题

最短路总结

同余最短路(总结)