Algorithm 为什么Floyd Warshall中3个循环的顺序很重要?

Algorithm 为什么Floyd Warshall中3个循环的顺序很重要?,algorithm,graph-algorithm,Algorithm,Graph Algorithm,在popular实现中,我们使用三个循环,循环变量i,j,k。此处i&j分别用于指示两个顶点的源和目标,因此“k”表示“中间”顶点。如果我把循环变量“k”放在第三位而不是第一位,我会得到错误的答案。为什么?以下是弗洛伊德·沃沙尔算法背后的想法: if: i is connected to k and k is connected to j then if i and j are not connected, create a connection between i and j 另一种解释:

在popular实现中,我们使用三个循环,循环变量i,j,k。此处i&j分别用于指示两个顶点的源和目标,因此“k”表示“中间”顶点。如果我把循环变量“k”放在第三位而不是第一位,我会得到错误的答案。为什么?

以下是弗洛伊德·沃沙尔算法背后的想法:

if:
i is connected to k and
k is connected to j
then if i and j are not connected,
create a connection between i and j
另一种解释:

if:
i -> k and
k -> j
then if not i -> j
create i -> j
我想说的是,K将处于逻辑连接的中间。中间顶点k负责为N个相邻顶点提供直接连接的权限

上述算法必须应用于| V |顶点,因此k上的循环必须是最外层的for循环

例如:

DiGraph:
Vertices: 0,1,2
Edges: (0,1), (1,2)
Representation: 0 -> 1 -> 2   
算法:

k = 0
i = 0 ignore because k = i
i = 1 false because 1 -> 0 is wrong
i = 2 false because 2 -> 0 is wrong

k = 1
i = 0 true because 0 -> 1
j = 0 ignore because i = j
j = 1 ignore because j = k
j = 2 true because 1 -> 2
Since 0 -> 2 does not exist, create this edge
i = 1 ignore because i = k
i = 2 false because 2 -> 1 is wrong

k = 2
i = 0 true because we created this edge in the previous iteration
j = 0 ignore because i = j
j = 1 false because 2 -> 1 is wrong
j = 2 ignore because j = k
i = 1 true because 1 -> 2
j = 0 false because 2 -> 0 is wrong
j = 1 ignore because i = j
j = 2 ignore because j = k
i = 2 ignore because i = k
总之,
k需要执行| V |次
我需要为每个k执行| V |次
j需要为i->k上的每个成功i执行| V |次

时间复杂度:O(n3)


注意:如果您想应用或使用该算法,以便更好地了解其工作原理,请检查my,方法名称为
transitiveClosure()
。该方法在。

中实现,以下是Floyd Warshall算法背后的思想:

if:
i is connected to k and
k is connected to j
then if i and j are not connected,
create a connection between i and j
另一种解释:

if:
i -> k and
k -> j
then if not i -> j
create i -> j
我想说的是,K将处于逻辑连接的中间。中间顶点k负责为N个相邻顶点提供直接连接的权限

上述算法必须应用于| V |顶点,因此k上的循环必须是最外层的for循环

例如:

DiGraph:
Vertices: 0,1,2
Edges: (0,1), (1,2)
Representation: 0 -> 1 -> 2   
算法:

k = 0
i = 0 ignore because k = i
i = 1 false because 1 -> 0 is wrong
i = 2 false because 2 -> 0 is wrong

k = 1
i = 0 true because 0 -> 1
j = 0 ignore because i = j
j = 1 ignore because j = k
j = 2 true because 1 -> 2
Since 0 -> 2 does not exist, create this edge
i = 1 ignore because i = k
i = 2 false because 2 -> 1 is wrong

k = 2
i = 0 true because we created this edge in the previous iteration
j = 0 ignore because i = j
j = 1 false because 2 -> 1 is wrong
j = 2 ignore because j = k
i = 1 true because 1 -> 2
j = 0 false because 2 -> 0 is wrong
j = 1 ignore because i = j
j = 2 ignore because j = k
i = 2 ignore because i = k
总之,
k需要执行| V |次
我需要为每个k执行| V |次
j需要为i->k上的每个成功i执行| V |次

时间复杂度:O(n3)


注意:如果您想应用或使用该算法,以便更好地了解其工作原理,请检查my,方法名称为
transitiveClosure()
。该方法是在中实现的。

我不明白你到底在做什么,请向我们展示你的新算法也许我们理解:)我不明白你到底在做什么,请向我们展示你的新算法也许我们理解:)直观的解释,+1。即使我做了距离[I][j]=距离[I][k]+距离[k][j]我们不是在迭代所有可能的i,j和k的组合,所以这会给我们正确的答案吗?我能想象这不起作用的唯一方法是当我们在I,j,k上迭代的顺序产生了所有的差异。任何帮助都是值得赞赏的直观解释,+1。即使我做了距离[I][j]=距离[I][k]+距离[k][j],我们不是迭代了所有可能的I,j和k的组合,所以这会给我们正确的答案吗?我能想象这不起作用的唯一方法是当我们在I,j,k上迭代的顺序产生了所有的差异。任何帮助都将不胜感激