
弗洛伊德-沃舍尔(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++ 示例,演示如何使用 Floyd-Warshall 算法求解所有顶点对之间的最短路径:
#include <iostream>• 使用 INT_MAX / 2 而不是 INT_MAX 是为了避免在加法中发生整数溢出。
• 图以邻接矩阵形式表示,INF 表示两点间无直接边。
• 三重循环中,k 必须放在最外层,确保每次只引入一个新中间节点,符合动态规划顺序。
• 若需记录具体路径,可额外维护一个 parent[i][j] 数组,在更新 dist 时同步记录前驱节点。
• 时间复杂度:O(n³),三重循环。
• 空间复杂度:O(n²),存储距离矩阵。
适合顶点数不多(如 n ≤ 200)的场景,尤其适用于稠密图。
基本上就这些。Floyd-Warshall 实现简洁,理解其状态转移逻辑是关键。对于稀疏图,可以考虑 Johnson 算法替代。
立即学习“C++免费学习笔记(深入)”;
以上就是C++如何实现Floyd-Warshall算法_C++求解所有顶点对之间最短路径的动态规划算法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号