所以我试图理解Floyd-Warshall算法,虽然我可以实现它并清楚地看到它 工作,但我并不完全确定为什么< / em>它的作用是因为一件事:
因为对于每对顶点,我们检查是否有另外两对顶点允许我们在我们当前处理的对之间有一条较短的路径,并且在开始时我们只知道从顶点到它们自身的距离(这些都是0)和没有中间顶点的距离(这是我们的输入),我们怎样才能确定我们先处理的顶点将被赋予&#34; true&#34;最短的路径?我的意思是 - 当处理前几个顶点对时,我们所知道的只是输入和一些无穷大,所以为什么它保证它足以找到最短的路径而且在某个地方我们不会找到某些东西更有利可图,可以在开头的顶点使用?
答案 0 :(得分:1)
我相信这个想法是在每个阶段我都会找到每对顶点之间的最短路径,并且限制路径只能使用顶点1..i
诀窍在于归纳步骤。
考虑最短路径a-> b,并限制它只使用顶点1..i
有两种情况,要么路径通过i,要么不通过。
如果没有,则最短路径与上一轮相同。
如果确实经过i,则路径必须是a-&gt; i-> b的形式,总费用是距离a-> i加上距离i-> b,其中每个这些距离的范围从上一轮开始有效。
另一种观察方式是注意,在算法期间,特定的节点对(例如1和2)之间的距离将随着找到更好的路径而逐渐减小。最初距离将是直接距离1-> 2,但是如果有更好的路径,例如1-> 10-> 2,则可以在算法的第10阶段找到。
这感觉我们可能会出错,因为我们在多个点使用距离1-> 2,感觉我们可能使用了错误的值。然而,如果你记得在每个阶段我们都找到了“1和2之间的最短路径是什么,限制我们只能使用顶点1..i”