Floyd算法是一种经典的用于求解任意两点间最短路径的算法,由Robert W. Floyd于1962年提出,也称为Floyd-Warshall算法。
该算法基于动态规划思想,其核心思想是利用中间节点的集合不断更新任意两点间的最短距离。具体实现中,Floyd算法通过枚举每一个中间节点,然后在该中间节点集合上对所有的节点对进行更新,最终得到任意两点间的最短路径。
Floyd算法主要分为三个步骤:
初始化:将所有节点之间的距离初始化为邻接矩阵中的权值,如果两点之间没有边相连,则它们之间的距离设为无穷大。
递推更新:在中间节点集合上枚举每一个节点,更新任意两点间的最短距离。具体实现中,可以使用双重循环嵌套遍历所有的节点对,然后通过比较当前路径与经过中间节点的路径长度,更新最短路径。
输出结果:根据邻接矩阵中的最短路径,输出任意两点间的最短路径和距离。
Floyd算法的时间复杂度为O(n^3),其中n为节点数,因此该算法适用于较小的图或者密集图,对于稀疏图或者规模较大的图,其运行时间会较长。
下面是Floyd算法的C++实现,用于求解带权图的任意两点之间的最短路径:
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 100;
const int INF = 0x3f3f3f3f;
int d[MAXN][MAXN]; // 存储任意两点间的最短路径
int n; // 图中节点的数量
// Floyd算法,求解任意两点间的最短路径
void floyd()
{
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (d[i][j] > d[i][k] + d[k][j])
{
d[i][j] = d[i][k] + d[k][j];
}
}
}
}
}
int main()
{
// 读入图的信息
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> d[i][j];
if (d[i][j] == -1) // 两点之间无连接
{
d[i][j] = INF;
}
}
}
// 调用Floyd算法
floyd();
// 输出任意两点之间的最短路径
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << d[i][j] << " ";
}
cout << endl;
}
return 0;
}
以上代码实现了Floyd算法,使用了邻接矩阵存储图。在实际使用时,还需要注意处理图的输入输出方式,以及Floyd算法在存在负权边的情况下会失效,需要使用其他算法。