【最短路径】Floyd算法
来源:互联网 发布:网络基础知识ppt 编辑:程序博客网 时间:2024/05/16 05:00
我们刚刚做了关于图最短路径的题目,学了几个算法。但这些算法都是从单源出发,找到某点到源的最短距离。但是如果我们要求任意两点之间的最短距离呢?这时我们就要用到Floyd算法了!
这是一个o(n^3)的算法,但貌似最优的算法也是这个了。
这个算法的核心在于,我们知道有两个点i和j,那么我们假设i到j之间要经过一个点k,那么我们可以比较dis[i,j]和dis[i,k]+dis[k,j]的值哪个更小,就进行松弛。这个相信大家都很好理解,就是三角形原理。那么我们可以得到:
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
for(int k=0;k<n;++k)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
但这时我们要想了,如果在经过顺序处理后,有一个点更新了,那之前的点就无法更新了,我们可能要这样处理很多很多次,这个是有可能的。这样时间复杂度远远不止o(n^3)。
我们怎么处理这个东西呢?可以把k点的循环写在最外面,那么我们就有:
for(int k=0;k<n;++k)
for(int j=0;j<n;++j)
for(int i=0;i<n;++i)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
这时可以证明一次Floyd以后dis[x][y]就是最优解。
为什么呢?因为Floyd算法实际上可以写成动态规划的形式f[i][j][k]表示从i到j,经过的最大边的编号不超过k-1的最小值。
所以就是这样的了!
0 0
- Floyd最短路径算法
- 最短路径(Floyd算法)
- 最短路径 floyd算法
- 最短路径--Floyd算法
- Floyd最短路径算法
- Floyd最短路径算法
- 最短路径Floyd算法
- 最短路径 Floyd算法
- Floyd最短路径算法
- 最短路径floyd算法
- 最短路径(floyd算法)
- Floyd最短路径算法
- 【最短路径】Floyd算法
- Floyd最短路径算法
- 最短路径--Floyd算法
- Floyd最短路径算法
- 最短路径-Floyd算法
- 最短路径-floyd算法
- 设计模式中类的关系
- 【转载】树状数组(简单)
- 上一个十年,下一个十年
- 【kuandui】二叉堆
- 对付内存改写问题的银弹
- 【最短路径】Floyd算法
- MIPS架构培训之Cache原理
- 【转载】最小生成树
- tomcat启动报java.io.EOFException错误
- MIPS CP0 Hazards问题--从Release1到Release2
- 【数据结构】树状数组
- MIPS架构培训之MMU原理
- 【数据结构】线段树
- 异常捕捉与反汇编分析