今天利用空(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)那道题喜欢它。。。