算法简介:Floyd算法是一种求解多愿最短路径的算法,核心思想是动态规划和插值法。利用动态规划来计算节点之间的距离,然后依次插入节点,比较dis[a,c]和(dis[a,b]+dis[b,c])的距离。
设计思路:
根据上述的思想,首先用一个二维数组来存储节点之间的距离,节点自己到自己的距离为0,初始时没有直接连接的节点之间的距离为无穷大。再利用动态规划来更新此二维数组。然后,在每一次的循环遍历中,插入新的节点,并计算节点之间的距离。比如计算a到c的距离:distance[a,c]=min(distance[a,c],(distance[a,b]+distance[bc]))。即,a->c的最短距离为a直接到c的距离或者a->b->c的距离,如下图。中间的节点b是插入的节点,用此方法,依次插入所有的节点,同时,更新节点之间距离的数组。代码用三层循环即可完成。
![](https://i-blog.csdnimg.cn/blog_migrate/29f191d60c0e4015ee5b17a91bc0ebe5.png)
代码:
/*Floyd算法*/
#include <iostream>
using namespace std;
#define number 4 //定义节点数量
#define INT 0x3f3f3f3f //定义无穷大
/*节点距离:*/
int edge[number][number] = {
{0,3,7,4},
{3,0,2,INT},
{7,2,0,2},
{4,INT,2,0}
};
int main()
{
/*Floyd算法:动态规划+插值法*/
for (int k = 0; k < number; k++)
{
for (int i = 0; i < number; i++)
{
for (int j = 0; j < number; j++)
{
/*更新节点之间的最短距离*/
if (edge[i][j] > (edge[i][k] + edge[k][j]))
{
edge[i][j] = edge[i][k] + edge[k][j];
}
}
}
}
/*输出节点到其他节点之间的最短路径距离:*/
for (int i = 0; i < number; i++)
{
cout << "节点" << i << "的最短路径距离:";
for (int j = 0; j < number; j++)
{
cout << edge[i][j] << " ";
}
cout << endl;
}
return 0;
}
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/8ff7f0b7854b16e6e3dea5b343b7e88b.png)
总结:
对于Floyd算法,核心思想是动态规划和插值法,动态规划其实带有记忆功能的蛮力法。利用动态规划依次更新节点之间的距离,再利用插值法依次将中间节点插入,直到所有的节点都被插入到节点距离数组中。