弗洛伊德算法是图论中求得最短路径的一种O(N三次方)的一种算法。
它的中心思想是将每一个中转点枚举,从而求得最短路径。代码就不写了。
最近在看弗洛伊德算法是,发现其中有一条重要的规矩,就是要把有关中转点k的枚举的for循环放在最外层,这是问什么呢??本蒟蒻上网搜,问大佬,都没有得到想要的答案,后来灵光乍现,突然明白了。
解释:
我们先明白有关中转点k的for循环放在最内层和放在最外层的区别是什么。
如果将其放在最内层,我们会反复枚举中转点k,而被中转点连接的两个点i和j只会枚举一次,而如果放在最外层,我们就会反复枚举i和j。这就是两种格式的区别
假设f[i][j]是从i到j的距离
如果我们反复枚举k而有关i和j只枚举一次,由于我们枚举k时不知道此时f[i][k]或
f[k][j]是否是最小值,所以即使当前的f[i][k]+f[j][k]为f[i][j]的最小值但当i或j枚举到k的值时,我们又发现了有关k的新的最小值,而此时我们却没有办法再改变f[i][j]的最小值了,所以放在最内层是错误的。
而如果放在最外层,我们会将与k相连的i和j反复枚举从而求出有关k的最小值,这样就避免了无法改变f[i][j]最小值的尴尬情况。
就是这样。