Floyd算法学习

今天做了个题,LeetCode1462,对于同一个图多次查询最短路径,然后用dfs超时了,之后就不会了,看题解是用floyd。但是这个算法看起来简单,我想了很久,主要是这个dp的无后效性想了很久,现在差不多明白了,之前怕的后效性指的是,当第k个点作为中继点将某两个(设为ij)点松弛之后,ik和kj在之后的过程中如果被其他点(设为l)松弛,能否保证在这些松弛过程中ij之间一直是当前最优的,即点l来时的松弛效果能直接传递到点ij上,即是无后效性的关键。

还是接着之前的情况考虑。当点l来的时候,它必然出现在ik之间或kj之间,不妨让他出现在ik之间吧。那么在点l的松弛轮次中,对ik是正常的松弛结果,而l到j呢?仔细一想可以知道,l到j无非是选择经过k与否的问题,而这个问题在点k的松弛轮次中已经解决。因此也就体现出了无后效性。

也就是说,每一个新点在开始往路上插之前,都已经被已经进行过插点轮次的点检验过是否插了,所以当它往别人的路上插的时候,完全不用考虑能否更新当前路被它分割的其他部分是否最优。因为其他部分是以他为起点或终点而被已出现中继点分割的路径,在之前的中继轮次中已经考虑,这里相当于记忆化直接使用结果了。

dpyyds。

原文地址:https://www.cnblogs.com/agnes6/p/13232154.html