当前位置: 首页 > news >正文

Floyd算法:3行代码搞定全源最短路

一、上期回顾

掌握SPFA 算法,解决带负权边的最短路问题,并且可以判断负环。 今天学习图论最短路最后一个核心算法Floyd 算法,专门求所有点到所有点的最短路径。


二、Floyd 核心概念

1. 解决什么问题

给定一个图(有向 / 无向、可带负权),求出任意两点 i 到 j的最短路径。

  • 多源最短路:起点和终点都是任意的
  • 优点:代码极简,3 层循环搞定,不用队列、不用堆
  • 缺点:复杂度较高 \(O(n^3)\),只适合小规模图(n ≤ 500)

2. 核心思想(动态规划 DP)

中转站思想: 对于任意两点i → j,判断是否经过中间点 k能更近:

i → j 直接走 i → k → j 绕一下

取距离最小的那个。


三、数据结构

Floyd 必须用邻接矩阵存图:

const int N = 505; const int INF = 0x3f3f3f3f; // 用这个无穷大,相加不溢出 int dist[N][N]; // dist[i][j] 表示 i 到 j 的最短距离

四、Floyd 万能模板(必背,3 行核心)

#include <iostream> #include <cstring> using namespace std; const int N = 505; const int INF = 0x3f3f3f3f; int dist[N][N]; int n, m; // n 个点,m 条边 void init() { // 1. 初始化:自己到自己距离 0,其余无穷大 for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) dist[i][j] = (i == j) ? 0 : INF; } void floyd() { // 核心 3 层循环!!!顺序不能变:k -> i -> j for (int k = 1; k <= n; k++) // 中转点 for (int i = 1; i <= n; i++) // 起点 for (int j = 1; j <= n; j++)// 终点 // 松弛操作:i->k->j 更近就更新 if (dist[i][k] < INF && dist[k][j] < INF) dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]); } int main() { cin >> n >> m; init(); // 建图 for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; dist[u][v] = min(dist[u][v], w); // 重边取最小 // 无向图:dist[v][u] = min(dist[v][u], w); } floyd(); // 输出任意两点距离 for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (dist[i][j] == INF) cout << "-1 "; else cout << dist[i][j] << " "; } cout << endl; } return 0; }

五、关键要点(死记硬背)

  1. 循环顺序绝对不能错

    • 最外层:中转点 k
    • 中间:起点 i
    • 最内层:终点 j
  2. 无穷大推荐用0x3f3f3f3f

    • INT_MAX安全,两个相加不会溢出
  3. 判不可达

    if (dist[i][j] == INF) 不可达

六、三大最短路算法终极对比

表格

算法类型数据结构复杂度适用场景
Dijkstra单源\(O(E \log V)\)无负权,大数据图
SPFA单源队列不稳定有负权,判负环
Floyd多源矩阵\(O(n^3)\)任意两点,小数据

七、今日核心总结

  1. Floyd 是多源最短路,求任意 i 到 j 的距离
  2. 核心代码3 层循环,顺序:k → i → j
  3. 基于 DP 思想,用中转站松弛更新距离
  4. 代码极简,适合笔试快速默写
  5. 数据量大绝对不能用,会超时

八、课后练习

  1. 手写 Floyd 模板,建一个 4 个点的图,输出全源最短路
  2. 尝试加入负权边,看是否能正常计算
http://www.cnnetsun.cn/news/2620388.html

相关文章:

  • CSS Cascade Layers:重新定义样式优先级
  • “属性”详解
  • 回译评估:揭示多语言大模型真实能力的压力测试与实操指南
  • Arduino绘图机器人:传感器融合与自主决策的嵌入式实践
  • Keil MDK 5.25调试崩溃问题分析与解决方案
  • Sora 2动效设计终极 checklist:覆盖WebGPU兼容性、无障碍动画开关适配、深色模式过渡曲线等19项GA前必验项
  • Sora 2神经辐射场生成落地陷阱大全(92%工程师踩坑的5类场景+实时纠错代码片段)
  • Arduino智能小车实战:从传感器融合到状态机控制
  • AI 智能体时代,为什么 45% 的人会走向一人公司?
  • 构建免费欧洲金融数据MCP服务器:开源方案与工程实践
  • 科研绘图避坑指南
  • 别再只记AES了!聊聊DES、IDEA这些‘老家伙’在实战中的隐藏用法与安全陷阱
  • 哈夫曼编码
  • 【Unity Shader URP】水面效果 实战教程
  • 构建可靠RAG系统:数据摄取流水线核心环节与实战优化
  • 5分钟快速上手:applera1n激活锁绕过工具终极指南
  • 构建统一LLM API调用层:适配OpenAI、Claude、Gemini与开源模型
  • 别再只用GeoHash了!用Uber H3六边形网格搞定空间数据分析(Python实战)
  • 别再死记硬背了!用Python+MATLAB/Simulink,手把手带你仿真二阶系统的‘稳、快、准’
  • rtklib 2.4.3源码在VS2019中的高效调试技巧:从单步跟踪到实时变量监控
  • Unity ShaderGraph实战:用一张贴图和几个节点,5分钟搞定动态火焰特效
  • 哥斯拉流量分析实战:用Wireshark解密NewStarCTF Week4的WebShell通信
  • TP4056锂电池充电电路设计:解决嵌入式设备充电重启与续航难题
  • 基于树莓派Pico W与CircuitPython的辅助运动玩具设计与实现
  • 2026年口碑封口机制造厂专业推荐
  • Agent设计模式
  • 做搜索和内容生态来看!AI 原生搜索时代的架构跃迁与 GEO
  • Deepseek-V4-Flash 快速部署与调用实战指南
  • 受载煤体表面裂纹扩展规律与声电效应实验及应用方案【附数据】
  • 防雷接地计算规则