news 2026/4/26 1:49:19

【图论精讲】Floyd-Warshall 多源最短路算法(原理 + 二维模板 + 避坑 + 负环判定 + 实战)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【图论精讲】Floyd-Warshall 多源最短路算法(原理 + 二维模板 + 避坑 + 负环判定 + 实战)

一、算法定位(一句话定性)

Floyd‑Warshall 是基于动态规划的多源最短路算法。输入一张带权图,直接求出所有点对之间的最短路径

✅ 优点:代码极简、邻接矩阵实现、无需建复杂邻接表、支持负边权。

❌ 缺点:时间复杂度O(n³),仅适合点数 n ≤ 400 的小规模图。

适用场景:普及组 / 提高组图论基础题、传递闭包、负环判断、城市多点互通费用题。

二、核心本质:三维 DP 压成二维

1. 原始 DP 状态定义

dist[k][i][j]:只允许使用前 k 个点作为中转点时,i 到 j 的最短路。

2. 状态转移方程(核心公式)

dist[k][i][j] = min( dist[k-1][i][j], dist[k-1][i][k] + dist[k-1][k][j] )

含义:

  • 要么不经过 k:沿用原来最短路
  • 要么经过 k:拆成 i→k + k→j 两段路拼接

3. 空间优化(工程只用这版)

k 只依赖上一层,直接删掉第三维,只用二维邻接矩阵:dist[i][j] = min( dist[i][j], dist[i][k] + dist[k][j] )

三、严格执行顺序:三层循环绝对不能乱

🔴必须外层 k,中层 i,内层 j

✅ 正确顺序:中转点 k → 起点 i → 终点 j

❌ 顺序写错直接全部答案错误,无法纠错。逻辑:先固定中转站,再批量更新全图所有路径。

四、标准工程模板(可直接 AC 所有题目)

1. 常量与数组定义(防溢出标配)

#include <iostream> #include <algorithm> using namespace std; const int N = 405; // 优选INF:加法不易溢出,安全耐用 const int INF = 0x3f3f3f3f; // 邻接矩阵存最短路 int dist[N][N]; int n, m;

2. 邻接矩阵标准初始化(必考)

void init() { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (i == j) dist[i][j] = 0; else dist[i][j] = INF; } } }

规则:自己到自己距离为 0,不相连初始无穷大。

3. Floyd 核心松弛代码(背下来)

void floyd() { // k 必须在最外层:枚举中转点 for (int k = 1; k <= n; k++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { // 防溢出:只有两段都可达才更新 if (dist[i][k] < INF && dist[k][j] < INF) { dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]); } } } } }

五、关键拓展:负权边 + 负环判定

1. 能力边界

Floyd 允许负边权,但不允许负环。有负环则最短路不存在。

2. 负环快速判定(一句话原理)

跑完 Floyd 后,若存在任意点 i 满足dist[i][i] < 0,说明绕一圈距离变短,即存在负环。

bool has_negative_cycle() { for (int i = 1; i <= n; i++) { if (dist[i][i] < 0) return true; } return false; }

六、高频致命坑点(考试必看)

  1. 循环顺序写反:i/j/k 乱序 → 全错,无报错。
  2. INF 取值乱设:设成 1e9 容易相加溢出爆 int,必须用 0x3f3f3f3f。
  3. 不判 INF 直接加:无穷大加无穷大直接溢出负数,评测机直接 WA。
  4. 忘记初始化对角线为 0:自己到自己变成无穷大,整张图全乱。
  5. 有负环不特判:题目含负环强行求最短路,答案全部错误。

七、Floyd 与 Dijkstra 选型对照表(考场直接用)

维度Floyd-WarshallDijkstra
求解范围所有点对多源最短路单源单点出发最短路
时间复杂度O(n³)O (m log n) 堆优化
负边权支持(不可负环)不支持负边权
代码难度极简三重循环邻接表 + 优先队列复杂
适用规模n ≤ 400n 上万都能跑

八、适合刷题场景(直接对标洛谷真题)

  1. 城市多点互通费用、机场换乘、多站点统一算路费 → 直接 Floyd
  2. 传递闭包、判断两点是否可达 → 改一下权值为 0/1 即可
  3. 小规模图、不想写邻接表、想快速写最短路 → 无脑 Floyd
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 1:44:28

2025届学术党必备的五大降重复率平台横评

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 就当下而言&#xff0c;AI技术已经深度渗透进学术写作流程里面了。依靠AI去协助毕业论文的撰…

作者头像 李华
网站建设 2026/4/26 1:34:36

语雀文档批量导出工具:轻松迁移知识资产到本地Markdown

语雀文档批量导出工具&#xff1a;轻松迁移知识资产到本地Markdown 【免费下载链接】yuque-exporter export yuque to local markdown 项目地址: https://gitcode.com/gh_mirrors/yuq/yuque-exporter 在知识管理平台频繁调整策略的今天&#xff0c;许多创作者面临着一个…

作者头像 李华
网站建设 2026/4/26 1:34:28

Keras活动正则化:原理、实现与调优实战

## 1. 项目概述&#xff1a;理解Keras中的活动正则化在深度学习模型训练过程中&#xff0c;过拟合是个老生常谈却又避不开的问题。最近我在图像分类任务中遇到一个典型案例&#xff1a;模型在训练集上准确率达到98%&#xff0c;测试集却只有72%。这种明显的性能落差让我重新审视…

作者头像 李华
网站建设 2026/4/26 1:32:24

LLM 部署:从本地到云服务

LLM 部署&#xff1a;从本地到云服务 1. 引言 随着大语言模型&#xff08;LLM&#xff09;的快速发展&#xff0c;如何高效、稳定地部署LLM成为了企业和开发者面临的重要挑战。从本地开发环境到云服务平台&#xff0c;不同的部署方式各有优缺点&#xff0c;适用于不同的场景需…

作者头像 李华
网站建设 2026/4/26 1:27:31

毕业焦虑退散!用百考通AI帮你高效打通毕业论文全流程

当同龄人还在为开题报告发愁时&#xff0c;你已经完成了格式规范、参考文献齐全的初稿&#xff0c;并开始准备答辩PPT了。 深夜的宿舍里&#xff0c;电脑屏幕发出幽幽蓝光。Word文档上一行行文字反复修改&#xff0c;格式总是不对&#xff0c;文献堆积如山&#xff0c;导师的修…

作者头像 李华