将源计数到k长度的目标路径

时间:2015-01-12 15:46:41

标签: algorithm graph divide-and-conquer

HERE作者讨论了三种计算k长度的源到目标路径的方法。我无法获得基于分而治之的方法的最后一种方法,并且声称是及时的O(V ^ 3logk)。

  

我们也可以使用Divide and Conquer来解决上述问题   O(V ^ 3Logk)时间。从u到v的长度k的步数是   [u] [v]进入(图[V] [V])^ k。我们可以通过做计​​算来计算能力   O(Logk)乘法使用分而治之技术   计算能力。两个大小为V x V的矩阵之间的乘法   需要O(V ^ 3)时间。因此,该方法的总时间复杂度是   O(V3Logk)。

特别是说

的行
  

从u到v的长度为k的步数是[u] [v]'中的条目   (曲线图[V] [V])^ķ

1 个答案:

答案 0 :(得分:1)

如果使用邻接矩阵来表示图形(让我们说M),则M ^ k是表示每对节点之间的大小为k的路径数的矩阵。您可以使用O(log k)矩阵乘法(每次采用O(V ^ 3)时间)计算M ^ k。

它是一种分而治之的算法,因为要计算M ^ k,你可以计算M' = M ^(k / 2)然后M ^ k = M' x M' (或者M' x M' x M,如果k不能被2整除)。

以下是O(log k)乘法中M ^ k计算的示例:

def matrix_mul(A, B):
    return [[
           sum(x * B[i][col] for i,x in enumerate(row)) for col in range(len(B[0]))
    ] for row in A]

def matrix_pow(M, k):
    if k==1: return M
    M2 = matrix_pow(M, k/2)
    M2 = matrix_mul(M2, M2)

    if k%2==1: M2 = matrix_mul(M2, M)
    return M2

M = [[0,1,1,0,1,0,0,0],
     [0,0,0,0,1,1,0,0],
     [0,0,0,1,0,0,0,0],
     [0,0,0,0,0,1,1,0],
     [0,0,0,0,0,0,0,0],
     [0,0,0,0,1,0,0,0],
     [1,0,1,0,0,0,0,0],
     [0,0,0,1,0,0,0,0]]

for i in range(1, 10):
    print 'Paths from 7 to 2 of size', i, '=', matrix_pow(M, i)[6][1]

哪个输出:

Paths from 7 to 2 of size 1 = 0
Paths from 7 to 2 of size 2 = 1
Paths from 7 to 2 of size 3 = 0
Paths from 7 to 2 of size 4 = 0
Paths from 7 to 2 of size 5 = 1
Paths from 7 to 2 of size 6 = 1
Paths from 7 to 2 of size 7 = 0
Paths from 7 to 2 of size 8 = 1
Paths from 7 to 2 of size 9 = 2