不知道为啥题解都默认认为 dijkstra 可以直接求最长路径,可能是我比较菜吧。
正确性证明:
假设有 v0−>vi 是 dist中且vi∈/S(S 为已确定最长路径的点的集合)的最大路径,却不是 v0−>vi 的最长路径,那么一定存在 vk∈/S 使得 v0−>vk−>vi 是 v0−>vi 的最长路径。
反证法易证乘法计算的最长路径满足 largest(v0−>vk−>vi)=largest(v0−>vk)∗largest(vk−>vi)
因为 v0−>vk 必定要从 S 延申边。不妨认为 vk 是已记录到 dist 中的点。
因为汇率 0<w<=1 ,有 largest(v0−>vk),largest(vk−>vi)>=1 ,如果为 1 ,不影响最长路径;如果不为 1 一定有 largest(v0−>vk)=dist(v0−>vk)>dist(v0−>vk−>v−>vi),与条件矛盾。