最短路问题总结
一张图梳理关系

权值相同最短路
(1)BFS
针对:任意两个相邻点的距离相等的最短路问题,设此距离为1
存储:
- 初始数据数组/nxt数组
- 队列
- 标记数组,记录答案数组
模版:
单源最短路
(1)堆优化Dijkstra算法
前提:\(D=<V,E>\)且\(w_i>=0\)
针对:无负权边的单源最短路径问题
核心:
- 将V分为:“已确定”部分 | "待定"部分
- 从队列中选择距离源点最近的点u,将u加入“已确定”部分
- 松弛:检查是否能通过u,使得源点到“待定”点的距离变小
存储:
- 邻接表
- 优先队列
- 距离数组(d/dis/dist)
初始化:d[i]=INF
优化:if(dis>d[u1]) continue;
模版:
(2)Bellman-Ford算法
前提:无
针对:有负权边的单源最短路径问题
核心:
- \(|V|-1\)轮循环
- 每轮循环都尝试用\(|E|\)条边,松弛源点到各点的距离
- 负权环检测:
\(|V|-1\)轮循环结束后,尝试用\(|E|\)条边松弛各点距离
若可以松弛⇒有负权环
存储:边集数组+距离数组
优化:flag若d[n]在本轮没有变化,提前结束外层循环
模版:
边集数组版本:
https://www.cnblogs.com/kingsteph1209/p/19640258
多源最短路
(1)Floyd算法
有人将此算法称为“只有五行的算法”
前提:无
针对:有负权边的多源最短路径问题
核心:
- 尝试在任意两点间插入第三个点k/通过第三个点k,看能不能通过k缩短两点距离
- 前k次循环(包含第k次),表示从i->j,只途经编号为1~k点,最短距离dis[i][j]
存储:邻接矩阵
初始化:
dis[i][j]=INF;dis[i][i]=0;
dis[x][y]=w;dis[y][x]=w;
模版:
注意 我写的时候往往会加上
if(dis[i][k]!=INF&&dis[k][j]!=INF)
(2)Jonhson算法
针对:有负权边的多源最短路径问题
核心:Bellman-Ford+Dijkstra
存储:邻接表
模版:

浙公网安备 33010602011771号