python 中的 Warshall 算法与 Floyd 算法有何不同?

How is the Warshall algorithm different from Floyd algorithm in python?

我的学校作业是使用邻接矩阵完成这两个任务,但几乎每个 google 搜索都只将 floyd-warshall 显示为一种算法。我已经有了只有弗洛伊德的代码。有人知道 Warshall 算法吗?这两者有什么区别?

欢迎来到 Whosebug。我想您的大部分 Google 研究结果都产生了 Floyd-Warshall 算法。我希望以下内容能够回答您的问题并澄清任何疑问。

首先,Floyd-Warshall 算法解决了所有对最短路径 (APSP) 问题,其目标是找到图中所有节点对之间的最短路径(在您的例子中,表示为邻接矩阵)。该算法之所以有这个名字,是因为研究人员 Stephen Warshall 和 Robert Floyd 独立提出了一个非常相似的策略来解决 APSP 问题。

实际上,原始的 Warshall 算法更简单,因为它只找到图的传递闭包,并且不使用任何关于边权重的信息。 Floyd 的算法基本上是这个算法加上对这些权重的额外考虑。

给定一个 n x n 表示有向图的邻接矩阵 G,其传递闭包是一个布尔值 n x n 矩阵,其中 (i, j) 处的条目等于 true 当且仅当存在从顶点 [=12= 的有向路径时] 到顶点 j。 Warshall 的算法通过重复计算邻接矩阵(每个顶点一个)来找到此传递闭包。让我们调用 W^k 这样的矩阵,其中 0 <= k <= nW^0 表示没有任何中间顶点的路径,W^n 的条目设置为 true 当顶点之间存在一条路径时,该路径具有来自图的任何顶点的中间顶点。算法如下:

def warshall(G):
  '''The graph G may be represented by means of a numpy matrix'''

  W = G  # this would be W^0
  n = len(G)
  for k in range(n):
    for i in range(n):
      for j in range(n):
        # (*)
        G[i, j] = G[i, j] or (G[i, k] and G[k, j])

  return W  # this would be W^n

对于 Floyd 算法,输入图应表示为加权邻接矩阵,它与 Warshall 的算法完全相同,但 (*) 行更改为 G[i, j] = min(G[i, j], G[i, k] + G[k, j])。 使用最小值是因为目标是最小化整体重量。