0

0

C++怎么实现Floyd算法_C++多源最短路教程【图论】

穿越時空

穿越時空

发布时间:2026-03-06 12:31:01

|

369人浏览过

|

来源于php中文网

原创

floyd算法核心是k在最外层的三重循环,初始化用int_max/2防溢出,负环检测通过disti

c++怎么实现floyd算法_c++多源最短路教程【图论】

Floyd算法的核心实现就三重循环,别写错k的位置

标准Floyd的三层循环顺序必须是 k 在最外层,ij 在内层。如果把 ij 放最外层,结果大概率是错的——它会漏掉某些中间节点的松弛路径。

  • k 表示“当前允许经过的中间节点编号”,必须从 0 到 n-1 依次枚举,保证每轮都扩展一个新中转点
  • 内层 ij 遍历所有点对,检查是否能通过 k 缩短距离:dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
  • 初始化时,dist[i][i] 设为 0,有边的设为对应权重,无边的设为一个足够大的数(如 INT_MAX/2,避免加法溢出)

INT_MAX 直接用会溢出,得用 INT_MAX/2 或 LLONG_MAX/2

当图里存在 INT_MAX 表示的“无穷大”,两个 INT_MAX 相加会整数溢出,变成负数,后续比较就全乱了。这不是理论风险,是实际跑几组数据就能复现的 bug。

  • 推荐初始化为 INT_MAX / 2int 类型)或 LLONG_MAX / 2long long 类型)
  • 不要用 -10x3f3f3f3f 混用——前者无法参与 min() 正常比较,后者在 64 位下可能不够大
  • 判断不可达时,别写 if (dist[i][j] == INT_MAX),要写 if (dist[i][j] > INF / 2),其中 INF 是你定义的上限值

检测负环只需在 Floyd 结束后加一行判断

Floyd 本身不显式报错负环,但跑完后只要发现任意 dist[i][i] ,就说明从 <code>i 出发存在负权回路。这是最直接、开销最小的检测方式。

海绵音乐
海绵音乐

字节跳动推出的AI音乐生成工具

下载
  • 不需要额外跑一遍循环,就在三重循环之后立刻加:for (int i = 0; i
  • 注意:有些实现会跳过 i == kj == k 的情况,但检测负环必须看对角线 dist[i][i],不能省
  • 如果只关心最短路,不关心负环,这步可省;但一旦输入图可能含负权边,这行就得加上,否则结果无意义

空间复杂度 O(n²),但二维数组别用 vector> 动态套娃

频繁访问二维 vectordist[i][j],比原生 int dist[N][N]vector<int> dist(N * N)</int> 慢不少,尤其在 n 较大(比如 500+)时明显卡。

立即学习C++免费学习笔记(深入)”;

  • 优先用一维模拟二维:dist[i * n + j],连续内存,cache 友好
  • 若必须用 vector,至少声明为 vector<vector>> dist(n, vector<int>(n))</int></vector>,别在循环里反复 push_back
  • 编译器对 int dist[500][500] 的优化很成熟,只要 n 确定且不太大(≤1000),栈上分配也完全可行

Floyd 看似简单,但 k 循环位置、无穷大取值、负环检测时机、内存布局这四点,任一出错都会导致结果错误或运行异常——它们不是边缘情况,而是日常调试里最常卡住的地方。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

841

2023.08.22

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

950

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

604

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

212

2025.08.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

434

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

600

2023.08.10

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

487

2023.08.14

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

19

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.7万人学习

C 教程
C 教程

共75课时 | 5.2万人学习

C++教程
C++教程

共115课时 | 20.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号