Floyd算法
来源:互联网 发布:斯沃琪淘宝旗舰店 编辑:程序博客网 时间:2024/05/29 10:03
设n=|V|,从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。
那么如何实现呢?首先,定义一个n*n邻接矩阵,表示各点之间的最短距离,其中a[i,j]为点i到点j的最短距离,且初始状态是无边的(即对于任意点对i,j都有a[i][j]= +∞)。随着读入矩阵会记录各点之间边的信息,然后对于每一对顶点u和v,我们采用松弛操作,看是否存在一个顶点w使得从u到w再到v比从u到v的已知路径更短,如果是则更新它;在松弛中,我们会运用到动态规划的思想(简单来说就是由局部最优解推全局最优解,动态规划的使用要求问题满足以下两个性质:1、无后效性;2、最优子结构),状态转移方程(即上文所说的公式)为map[u][v]=min(map[u][w]+map[w][v],map[u][v])。通过不断松弛,可以将这个矩阵更新为一个最优的距离矩阵。
由于首先我们要枚举每一个点对,这里相当于枚举n^2次,对于每个点对我们还要枚举所有其它点,这里又要枚举n次,故时间复杂度为O(n^3);用邻接矩阵存图,空间复杂度为O(n^2)。
代码如下:(C++ Code)
1 voidFloyd(int n)
//n为点数
2 {
3 for(int k=1;k<=n;k++)
4 for(int i=1;i<=n;i++)
5 for(int j=1;j<=n;j++)
6 map[i][j]=min(map[i][k]+map[k][j],map[i][j]);
//要注意枚举的次序,点对在第二、三重循环
7 }
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- floyd 算法
- Floyd算法
- floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- floyd算法
- Floyd算法
- Floyd算法
- Floyd算法
- 动态规划入门篇
- Android--ViewTreeObserver介绍
- iOS平台-2016年最新版申请企业账号步骤分享
- 页面显示时钟
- 计算字母位置?
- Floyd算法
- System v 和Posix
- USACO刷题网站
- java 对象流(ObjectOutputStream,ObjectInputStream)
- 面向对象编程思想-命令模式
- iscsi磁盘共享服务
- 将数据输入到文件中
- Email邮件服务的搭建(postfix on rhel7.2)
- 【Android API】Activity的四种启动详细分析