是真懂还是假懂?
Floyed算法:是最短路径算法可以说是最慢的一个。
原理:O(n^3)的for循环,对每一个中间节点k做松弛(寻找更短路径);
但它适合算多源最短路径,即任意两点间的距离。
但spfa,迪杰斯特拉就只能算一个点到其他任一点的最短路径。
关键在于,我们真的真正理解floyed吗?
就是因为它太短了,以至于我们有些人(神仙除外)看代码后看到这样一个语句:
d[i][j]=min(d[i][j],d[i][k]+d[k][j])
也就是说,对于每一个中转点k来说,进行O(n^2)的松弛,一定能找到最短路径。
虽不是最优,但是松弛次数来凑!
这大概就是我们(之前的我)的无须证明的,想当然的理解,并背下来了它,以便以后想TLE时用。(???O(n^3));
so?
Floyed本质是dp;
递推公式:
(图片源自网络大佬)
![](https://img2018.cnblogs.com/blog/1606916/201906/1606916-20190613085306335-297048496.png)
众所周知,dp(动态规划)要满足无后效性。也就是说。。。。。。
还是先举个例子:
我们设k取某一个k1时满足k1为最终点i到j最短路经过的点,但是在外层循环到k1时d[i][k1]和d[k1][j]并没有取到最小值,因为k1只能取一次,那么往后再循环是不是就取不到k1了呢??
答案当然不是的(不然这个算法为什么正确?)
还是那句话,dp无后效性,
也就是说,k不单单是枚举,还是一个状态变量,找i和j之间通过编号不超过k(k从1到n)的节点的最短路径(一定要注意,这里是当前最短路径,
k之前的已经变成最短路了,对于每一个k,我们都进行了n^2的充分枚举(ij),已保证当前已经满足对从1到k的节点最优,
那么当k枚举完所有点,那么一定是最优的了
换句话说,在d[i][j]=min(d[i][j],d[i][k]&#