最短路总结
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]),边的松弛操作
以上是关于最短路总结的主要内容,如果未能解决你的问题,请参考以下文章