Warshall算法的思想和可能的改进

时间:2019-06-01 16:12:49

标签: algorithm graph-algorithm

Warshall的用于计算有向图的传递闭合的算法通常采用以下形式(来自Warshall algorithm idea and improvement):

ALGORITHM Warshall(A[1..n, 1..n])
    //ImplementsWarshall’s algorithm for computing the transitive closure
    //Input: The adjacency matrix A of a digraph with n vertices
    //Output: The transitive closure of the digraph
    R(0) ←A
    for k←1 to n do
        for i ←1 to n do
            for j ←1 to n do
                R(k)[i, j ]←R(k−1)[i, j ] or (R(k−1)[i, k] and R(k−1)[k, j])
    return R(n)

但是我们可以通过注意| i-j |没有更新来加快上述实现。 <= k,因此在这种情况下,我们可以跳过运行更新。

我想念什么吗?这种改进不会影响运行时间吗? (我还没有花时间来计算该版本的运行时间。)

1 个答案:

答案 0 :(得分:2)

您所缺少的是matches|i - j|i之间的距离无关。

Warshal算法在迭代k中执行的操作是仅使用{{1}中的顶点来确定在标记为 i的顶点和标记为 j的顶点之间是否存在路径}作为中间体。因此,如果满足以下两个条件之一,j应该等于1:

  1. {1, ..., k}。也就是说,仅使用R(k)[i,j]中的顶点作为中间点,在顶点i和顶点j之间存在一条路径。
  2. R(k-1)[i,j] = 1。也就是说,存在从顶点i到顶点k的路径,并且存在从顶点k到顶点j的路径,每个路径仅使用{1, ..., k-1}中的顶点作为中间。

R(k−1)[i, k] and R(k−1)[k, j]{1, ..., k-1}的值(以及i的值)与顶点j和顶点|i-j|之间的距离无关。它们是充当顶点标识符的任意标签。