目录
Floyd算法是一种用于解决所有点对最短路径问题的动态规划算法。它适用负权图但负权边不能在回路中,否则找到的最短路径不正确。在本文中,我们将深入了解Floyd算法的原理、代码实现以及一些应用场景。
一、什么是所有点对最短路径?
所有点对最短路径问题是在一个带权重的有向图中寻找任意两点之间的最短路径。最短路径可以通过边的权重之和来度量。
二、Floyd算法原理
Floyd算法采用动态规划的思想,通过中间节点逐步扩展来更新两点之间的最短路径。算法维护一个二维数组,记录每对顶点之间的最短距离。通过逐步添加中间节点,不断更新距离数组,最终得到所有点对的最短路径。
三、Floyd算法步骤
- 初始化距离数组,将直接相连的两点之间的距离设置为边的权重,其他距离设置为无穷大。
- 逐步添加中间节点,尝试通过中间节点更新两点之间的距离。
- 重复步骤2,直到所有中间节点都添加过一次。
- 最终得到所有点对之间的最短路径。
四、Floyd算法代码实现
给出下面的代码中的图
示例代码将打印出v0到v4的最短路径和最短路径长度
以下是使用C++实现Floyd算法的示例代码:
#include<iostream>
using namespace std;
#define V 5 //顶点个数
//这里需要尤其注意为什么要除以2,因为有可能会溢出int型导致变为负数
int int_max = INT_MAX / 2;
int graph[V][V] = { //图的邻接矩阵表示法
{0,int_max,1,int_max,10},
{int_max,0,int_max,1,5},
{int_max,1,0,int_max,7},
{int_max,int_max,int_max,0,1},
{int_max,int_max,int_max,int_max,0}
};
int A[V][V];
int path[V][V];
// 打印最短路径
void printPath(int src, int dest) {
if (path[src][dest] == -1) {
cout << "->" << dest;
return;
}
printPath(src, path[src][dest]);
printPath(path[src][dest], dest);
}
void Floyd() {
//将graph复制到A 初始化path数组
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
A[i][j] = graph[i][j];
path[i][j] = -1;
}
}
//Floyd
for (int k = 0; k < V; k++) { //k为中转点
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
if (A[i][j] > A[i][k] + A[k][j]) {
A[i][j] = A[i][k] + A[k][j];
path[i][j] = k;
}
}
}
}
}
int main() {
Floyd();
int src = 0, dest = 0;
cout << src;
printPath(src, dest);
cout << endl << "Floyd算法得到的最短路径长度:" << A[src][dest] << endl;
return 0;
}
五、运行结果
结果正确,读者可自行测试其它顶点对的最短路径。