Java 将Floyd Warshall限制为路径长度k

Java 将Floyd Warshall限制为路径长度k,java,algorithm,graph-algorithm,floyd-warshall,Java,Algorithm,Graph Algorithm,Floyd Warshall,我正在实施 我有大约50个节点的完整图,我想找到所有节点之间的最大路径。 算法返回的路径可以是任意长度的1w1(i,k)+w2(k,j): w12(i,j)=w1(i,k)+w2(k,j) 返回w12 w2=最短(w,w) w3=最短(w2,w) w4=最短(w2,w2) 在末尾,w4将为每一对包含从起点到终点的距离,最多使用4条边,对于w3也是如此。请注意,您可以计算w4,而无需先计算w3。使用这种形式的二值化,即计算并组合两个矩阵的所有幂,可以实现O(n³logk)的时间复杂度,即在最大路

我正在实施

我有大约50个节点的完整图,我想找到所有节点之间的最大路径。 算法返回的路径可以是任意长度的1w(i,j)成为i到j的权重。然后你可以计算

def最短(w1,w2):
w12=一个新的V x V矩阵
对于V中的i:
对于V中的j:
w12(i,j)=w1(i,j)
对于V中的k:
如果w12(i,j)>w1(i,k)+w2(k,j):
w12(i,j)=w1(i,k)+w2(k,j)
返回w12
w2=最短(w,w)
w3=最短(w2,w)
w4=最短(w2,w2)
在末尾,
w4
将为每一对包含从起点到终点的距离,最多使用4条边,对于
w3
也是如此。请注意,您可以计算
w4
,而无需先计算
w3
。使用这种形式的二值化,即计算并组合两个矩阵的所有幂,可以实现O(n³logk)的时间复杂度,即在最大路径长度中仅对数

维基百科有一篇关于上述算法的短文。它的标题是“”。也许与此术语或替代术语“距离乘积”相关的一些参考资料将提供有关可能实现的更多信息。例如,有一篇论文“”讨论了这个问题,给出了一些算法,并考虑了SIMD的实现。

w(i,j)
为i到j的权重。然后你可以计算

def最短(w1,w2):
w12=一个新的V x V矩阵
对于V中的i:
对于V中的j:
w12(i,j)=w1(i,j)
对于V中的k:
如果w12(i,j)>w1(i,k)+w2(k,j):
w12(i,j)=w1(i,k)+w2(k,j)
返回w12
w2=最短(w,w)
w3=最短(w2,w)
w4=最短(w2,w2)
在末尾,
w4
将为每一对包含从起点到终点的距离,最多使用4条边,对于
w3
也是如此。请注意,您可以计算
w4
,而无需先计算
w3
。使用这种形式的二值化,即计算并组合两个矩阵的所有幂,可以实现O(n³logk)的时间复杂度,即在最大路径长度中仅对数


维基百科有一篇关于上述算法的短文。它的标题是“”。也许与此术语或替代术语“距离乘积”相关的一些参考资料将提供有关可能实现的更多信息。例如,有一篇论文“”讨论了这个问题,给出了一些算法,并考虑了SIMD的实现。

问题还不够清楚,您能解释一下吗!你不需要做任何事。运行Floyd Warshall后,只需丢弃长度大于4的所有路径,因为这些路径已经是最短路径。我可以丢弃这些路径吗?该算法只返回任意两个节点之间的最小路径权重问题不够清楚,请您进一步解释!你不需要做任何事。运行Floyd Warshall后,只需丢弃长度大于4的所有路径,因为这些路径已经是最短路径。我可以丢弃这些路径吗?该算法只返回任意两个节点之间的最小路径权重