如果您使用邻接矩阵来表示图形(假设为 M),则 M^k 是表示每对节点之间大小为 k 的路径数的矩阵。您可以使用 O(log k) 矩阵乘法计算 M^k(每次需要 O(V^3) 时间)。
这是一种分而治之的算法,因为要计算 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