C++ 语言 实现 Floyd Warshall 算法

C++阿木 发布于 2025-06-14 12 次阅读


Floyd-Warshall 算法在 C++ 中的实现与优化

Floyd-Warshall 算法是一种用于计算图中所有顶点对之间最短路径的算法。它适用于带权图,并且可以处理负权边。该算法的时间复杂度为 O(n^3),其中 n 是图中顶点的数量。本文将围绕 Floyd-Warshall 算法在 C++ 中的实现展开,并探讨一些优化策略。

Floyd-Warshall 算法原理

Floyd-Warshall 算法的基本思想是通过逐步增加中间顶点,计算所有顶点对之间的最短路径。算法的步骤如下:

1. 初始化一个二维数组 dist,其中 dist[i][j] 表示顶点 i 和顶点 j 之间的最短路径长度。初始时,dist[i][j] 等于图中的边权值,如果顶点 i 和顶点 k 之间没有直接连接的边,则 dist[i][j] 设置为无穷大。

2. 对于每个顶点 k(1 ≤ k ≤ n),执行以下操作:
- 对于每个顶点 i(1 ≤ i ≤ n),执行以下操作:
- 对于每个顶点 j(1 ≤ j ≤ n),执行以下操作:
- 如果 dist[i][k] + dist[k][j] < dist[i][j],则更新 dist[i][j] 为 dist[i][k] + dist[k][j]。

3. 最终,dist[i][j] 将包含顶点 i 和顶点 j 之间的最短路径长度。

C++ 实现示例

以下是一个使用 C++ 实现的 Floyd-Warshall 算法的示例:

cpp
include
include
include

using namespace std;

void floydWarshall(int n, vector<#vector>& graph) {
vector<#vector> dist(n, vector(n, INT_MAX));

// 初始化 dist 数组
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (i == j) {
dist[i][j] = 0;
} else if (graph[i][j] != INT_MAX) {
dist[i][j] = graph[i][j];
}
}
}

// Floyd-Warshall 算法
for (int k = 0; k < n; ++k) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (dist[i][k] != INT_MAX && dist[k][j] != INT_MAX) {
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
}

// 打印最短路径长度
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (dist[i][j] == INT_MAX) {
cout << "INF ";
} else {
cout << dist[i][j] << " ";
}
}
cout << endl;
}
}

int main() {
int n;
cout <> n;

vector<#vector> graph(n, vector(n, INT_MAX));

cout << "Enter the adjacency matrix:";
for (int i = 0; i < n; ++i) {
for (int j = 0; j > graph[i][j];
}
}

floydWarshall(n, graph);

return 0;
}

优化策略

1. 空间优化:Floyd-Warshall 算法需要 O(n^2) 的空间来存储最短路径长度。可以通过只存储当前和下一阶段的最短路径长度来减少空间复杂度。

2. 并行化:Floyd-Warshall 算法可以并行化,因为每个阶段都可以独立计算。可以使用多线程或 GPU 来加速计算过程。

3. 稀疏图优化:对于稀疏图,可以使用邻接表来存储图,从而减少存储空间和计算时间。

4. 动态规划:Floyd-Warshall 算法可以看作是动态规划问题的一种特殊形式。通过动态规划的思想,可以进一步优化算法。

总结

Floyd-Warshall 算法是一种经典的最短路径算法,在 C++ 中实现相对简单。通过优化策略,可以进一步提高算法的效率。在实际应用中,根据具体问题选择合适的优化方法,可以显著提高算法的性能。