【最短路径】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
原创粉丝点击