【图论基础】floyd算法求最短路

今天利用空(shang)闲(ke)时间学习了floyd算法,回家整理一下笔记w


原理

这个算法本质上利用了动态规划思想,通过邻接矩阵递推出每两点之间的最短路。

首先我们需要建立一个三维数组D,用D[i][j][k]表示点i到点j经过1~k之间任意点的最短路径长度。

这个时候有两种情况:

1.设经过点k

    那么就是i到k的最短路长+k到j的最短路长:D[i][j][k]=D[i][k][k-1]+D[k][j][k-1]

2.设不经点k

    则延续过上一k点的最短路:D[i][j][k]=D[i][j][k-1]

最后比较一下那种情况路程更短就行啦:D[i][j][k]=min(D[i][k][k-1]+D[k][j][k-1],D[i][j][k-1])

因为都是k-1,所以到这里可以降一下维,来节省空间:D[i][j]=min(D[i][j],D[i][k]+D[k][j])


代码

记得要初始化,按照概念,存储两点之间的最短路,就是开个邻接表了,但记得要先将所有值设为∞,相同两点之间距离为0

然后核心代码就这么点:

for(int k=1;k<=n;k++)
    for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
        {			
             if(D[i][k]+D[k][j]<D[i][j])
             {
                D[i][j]=D[i][k]+D[k][j];
             }
	}

嗯,完全是按照上面的dp公式抄的,就不多说啦

然而,时间复杂度O(n³)的最短路算法,我只见过换教室(NOIP2016)那道题喜欢它。。。

猜你喜欢

转载自blog.csdn.net/maxmeansmaximum/article/details/80888331