头像

欢迎来到我的博客

分享题解与总结

最短路问题总结

一张图梳理关系

image


权值相同最短路

(1)BFS

针对:任意两个相邻点的距离相等的最短路问题,设此距离为1

存储

  1. 初始数据数组/nxt数组
  2. 队列
  3. 标记数组,记录答案数组

模版

https://www.bilibili.com/video/BV1D94y1m7z8/?spm_id_from=333.1387.collection.video_card.click&vd_source=34da0aa07edaca8b889ad016b25904d0


单源最短路

(1)堆优化Dijkstra算法

前提\(D=<V,E>\)\(w_i>=0\)

针对:无负权边的单源最短路径问题

核心

  1. 将V分为:“已确定”部分 | "待定"部分
  2. 从队列中选择距离源点最近的点u,将u加入“已确定”部分
  3. 松弛:检查是否能通过u,使得源点到“待定”点的距离变小

存储

  1. 邻接表
  2. 优先队列
  3. 距离数组(d/dis/dist)

初始化:d[i]=INF

优化:if(dis>d[u1]) continue;

模版

https://www.bilibili.com/video/BV1Ya411L7gb/?spm_id_from=333.1387.collection.video_card.click&vd_source=34da0aa07edaca8b889ad016b25904d0


(2)Bellman-Ford算法

前提:无

针对:有负权边的单源最短路径问题

核心:

  1. \(|V|-1\)轮循环
  2. 每轮循环都尝试用\(|E|\)条边,松弛源点到各点的距离
  3. 负权环检测:
    \(|V|-1\)轮循环结束后,尝试用\(|E|\)条边松弛各点距离
    若可以松弛⇒有负权环

存储:边集数组+距离数组

优化:flag若d[n]在本轮没有变化,提前结束外层循环

模版:

邻接表版本:
https://www.bilibili.com/video/BV1uL4y1N7Tb?spm_id_from=333.788.videopod.sections&vd_source=34da0aa07edaca8b889ad016b25904d0

边集数组版本:
https://www.cnblogs.com/kingsteph1209/p/19640258


多源最短路

(1)Floyd算法

有人将此算法称为“只有五行的算法”

前提:无

针对:有负权边的多源最短路径问题

核心

  1. 尝试在任意两点间插入第三个点k/通过第三个点k,看能不能通过k缩短两点距离
  2. 前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;

模版

https://www.bilibili.com/video/BV1u34y1575Y?spm_id_from=333.788.videopod.sections&vd_source=34da0aa07edaca8b889ad016b25904d0

注意 我写的时候往往会加上

if(dis[i][k]!=INF&&dis[k][j]!=INF)


(2)Jonhson算法

针对:有负权边的多源最短路径问题

核心:Bellman-Ford+Dijkstra

存储:邻接表

模版

https://www.bilibili.com/video/BV1KS4y1q7Kc?spm_id_from=333.788.videopod.sections&vd_source=34da0aa07edaca8b889ad016b25904d0

posted @ 2026-02-26 10:19  king_steph1209  阅读(55)  评论(0)    收藏  举报