我正在实施Floyd-Warshall algorithm。
我有大约50个节点的完整图,我想找到所有节点之间的最大路径。 算法返回的路径可以是任何长度1 <1。 x <50,我需要这个长度最多3-4个边长,我怎么能改变算法呢?
答案 0 :(得分:1)
让w(i,j)
为 i 到 j 的权重。然后你可以计算
def shortest(w1, w2):
w12 = a new V x V matrix
for i in V:
for j in V:
w12(i, j) = w1(i, j)
for k in V:
if w12(i, j) > w1(i, k) + w2(k, j):
w12(i, j) = w1(i, k) + w2(k, j)
return w12
w2 = shortest(w, w)
w3 = shortest(w2, w)
w4 = shortest(w2, w2)
最后,w4
将为每对使用最多4条边的开始到结束的距离,w3
也是如此。请注意,您可以先计算w4
而不计算w3
。使用这种形式的二值化,即计算和组合所有二次幂矩阵,可以实现O(n³logk)的时间复杂度,即在最大路径长度上只有对数。
维基百科有一篇关于上述算法的简短文章。它标题为“min-plus matrix multiplication”。也许与该术语相关的一些参考或替代术语“距离积”将导致关于可能实现的进一步信息。例如,有一篇论文“faster funny matrix multiplication for the all-pairs shortest paths problem”讨论了这个问题,给出了一些算法,并考虑了SIMD的实现。