让G = (V,E)成为你的图,并定义邻接矩阵A如下:
A[i][j] = 1 (V[i],V[j]) is in E
0 otherwise
在这个矩阵中,对于每个k:
(A^k)[i][j] > 0 if and only if there is a path from v[i] to v[j] of length exactly k.
这意味着通过创建此矩阵然后计算指数,您可以轻松得到答案。
对于快速指数计算,您可以使用exponent by squaring,这将产生O(M(n)^log(k)),其中M(n) 是nXn 矩阵的cost for matrix multiplication。
当您在同一张图上查找不同的查询时,这也将节省一些计算。
附录 - 索赔证明:
基础:A^1 = A,实际上在A 中定义,A[i][j]=1 当且仅当(V[i],V[j]) 在E 中
假设:假设所有l<k 的声明都是正确的
A^k = A^(k-1)*A。根据归纳假设,A^(k-1)[i][j] > 0 当且仅当存在从V[i] 到V[j] 的长度为k-1 的路径。
让我们检查两个顶点v1,v2,索引为i 和j。
如果它们之间存在长度为k 的路径,则设为v1->...->u->v2。设u 的索引为m。
来自 i.h. A^(k-1)[i][m] > 0 因为有路径。另外A[m][j] = 1,因为(u,v2) = (V[m],V[j])是一条边。
A^k[i][j] = A^(k-1)*A[i][j] = A^(k-1)[i][1]A[1][j] + ... + A^(k-1)[i][m]A[m][j] + ... + A^(k-1)[i][n]A[n][j]
既然A[m][j] > 0 和A^(k-1)[i][m] > 0,那么A^(k-1)*A[i][j] > 0
如果没有这样的路径,那么对于每个顶点 u 使得 (u,v2) 是一条边,从 v 到 u 没有长度为 k-1 的路径(否则 v1->..->u->v2是一条长度为 k) 的路径。
然后,使用归纳假设我们知道如果A^(k-1)[i][m] > 0 那么A[m][j] = 0,对于所有m。
如果我们在定义 A^k[i][j] 的总和中分配它,我们会得到 A^k[i][j] = 0
QED
小提示:从技术上讲,A^k[i][j] 是i 和j 之间的路径数,长度正好为k。这可以证明与上面类似,但更多地关注细节。
为了避免数字增长过快(这将增加M(n),因为您可能需要大整数来存储该值),并且由于您不关心 0/1 以外的值 - 您可以处理矩阵作为布尔值 - 仅使用 0/1 值并修剪其他任何值。