新闻中心

C++如何实现Floyd-Warshall算法_C++求解所有顶点对之间最短路径的动态规划算法

2025-11-21
浏览次数:
返回列表

c++如何实现floyd-warshall算法_c++求解所有顶点对之间最短路径的动态规划算法

弗洛伊德-沃舍尔(Floyd-Warshall)算法是一种经典的动态规划算法,用于求解有向或无向图中所有顶点对之间的最短路径。它适用于带权图,支持负权边,但不支持包含负权环的图。C++实现该算法简单高效,适合稠密图。

算法基本思想

Floyd-Warshall 的核心是动态规划:逐步尝试通过中间节点优化任意两点间的距离。设 dist[i][j] 表示从顶点 i 到 j 的最短距离。初始时,dist[i][j] 为图的邻接矩阵值。然后枚举每一个可能的中间点 k,检查是否可以通过 k 缩短 i 到 j 的路径:

状态转移方程: dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])

C++ 实现代码

以下是一个完整的 C++ 示例,演示如何使用 Floyd-Warshall 算法求解所有顶点对之间的最短路径:

CA.LA CA.LA

第一款时尚产品在线设计平台,服装设计系统

CA.LA 94 查看详情 CA.LA #include iostream>
#include
#include
using namespace std;

const int INF = INT\_MAX / 2; // 防止加法溢出

void floydWarshall(vector>& dist) {
int n = dist.size();

// 动态规划:枚举中间点 k
for (int k = 0; k for (int i = 0; i for (int j = 0; j if (dist[i][k] != INF && dist[k][j] != INF) {
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
}

// 输出结果
cout for (int i = 0; i for (int j = 0; j if (dist[i][j] == INF)
cout else
cout }
cout }
}

int main() {
int n = 4;
vector> graph = {
{0, 3, INF, 7},
{8, 0, 2, INF},
{5, INF, 0, 1},
{2, INF, INF, 0}
};

floydWarshall(graph);
return 0;
}

关键细节说明

• 使用 INT_MAX / 2 而不是 INT_MAX 是为了避免在加法中发生整数溢出。
• 图以邻接矩阵形式表示,INF 表示两点间无直接边。
• 三重循环中,k 必须放在最外层,确保每次只引入一个新中间节点,符合动态规划顺序。
• 若需记录具体路径,可额外维护一个 parent[i][j] 数组,在更新 dist 时同步记录前驱节点。

时间与空间复杂度

• 时间复杂度:O(n³),三重循环。
• 空间复杂度:O(n²),存储距离矩阵。
适合顶点数不多(如 n ≤ 200)的场景,尤其适用于稠密图。

基本上就这些。Floyd-Warshall 实现简洁,理解其状态转移逻辑是关键。对于稀疏图,可以考虑 Johnson 算法替代。

以上就是C++如何实现Floyd-Warshall算法_C++求解所有顶点对之间最短路径的动态规划算法的详细内容,更多请关注其它相关文章!


# 弗洛伊德  # 营销号如何带货推广  # SEO教程编发发带推荐  # 关于SEO的优点  # 个人优化推广网站  # 青岛定制网站建设的释义  # 新疆网站建设大概收费  # seo博客福州  # 永宁网站建设推广  # 影视推广投稿网站  # 网络营销推广合同案例  # 多线程  # c++  # 解决方法  # 怎么做  # 重写  # 适用于  # 如何实现  # 有什么  # 点对  # 最短  # stream  # ios  # ai 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符  b站赚钱渠道_b站收益来源  Golang如何安装Swagger工具_GoSwagger文档生成环境  J*aScript 字符串标签转换:使用正则表达式高效替换  必由学官网首页入口 必由学教师网页版登录指南  淘宝网网页版登录入口 淘宝官方网页版快捷登录  J*aScript实现单选按钮与关联输入框的联动禁用教程  C++如何生成随机数_C++ random库使用方法与范围设置  AO3最新可访问网址 Archive of Our Own官方在线入口  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示  优化HTML表单样式:解决输入框焦点跳动与元素间距问题  如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构  CKEditor 5 自定义构建在React应用中渲染失败的调试与解决  NetBeans Ant项目:自动化将资源文件复制到dist目录的教程  邮政快递包裹最新位置 邮政快递实时追踪入口  12306选座系统怎么选连座_12306选座多人连坐操作方法  iwriter统一登录平台 iwrite账号密码登录页面  大麦的“候补”是什么意思 大麦候补购票规则【详解】  Lar*el递归关系中排除子孙节点的策略  Golang如何优雅处理error_Golang error处理最佳实践总结  composer的"require-dev"部分是用来做什么的?  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  内存疯狂猛猛涨价:主板销量直接腰斩!  铁路12306官网网页端快速入口 铁路12306官方首页登录教程  TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程  包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接  天眼查企业查询官网入口 天眼查官方网页版查询  12306选座怎么选到特殊座位_12306特殊座位选择注意事项  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  c++中为什么推荐使用using替代typedef_c++现代化类型别名  荣耀Play7T运行卡顿解决_荣耀Play7T性能优化  抖音极速版最新版本 抖音极速版官方下载地址  抖音网页版平台入口 抖音网页版官网在线访问教程  Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理  Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践  葱吃多了会怎样 葱吃多了会伤胃吗  Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】  J*a递归快速排序中静态变量导致数据累积问题的解决方案  格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施  Tabulator表格日期时间排序问题及自定义解决方案  iCloud登录入口网页版 苹果iCloud官网登录  C++ string find函数返回值npos详解_C++字符串查找失败的判断条件  J*a应用程序首次运行自动创建文件与目录的最佳实践  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  Log4j Console Appender性能瓶颈与高并发优化策略  必由学官网快捷入口 必由学网页版在线学习平台 

搜索