假设你有一张图 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.
这意味着通过创建矩阵并计算指数,您可以轻松地获得答案。
为了快速计算指数,您可以使用指数平方法,它将产生O(M(n)^log(k)),其中M(n)是nXn矩阵的矩阵乘法成本。
这也可以在查找同一图上的不同查询时节省一些计算量。
附录 - 声明证明:
基: A^1 = A,并且确实在A中,A[i][j]=1当且仅当(V[i],V[j])在E中
假设:假设对于所有l
A^k = A^(k-1)*A。从归纳假设,A^(k-1)[i][j] > 0 当且仅当从V[i]到V[j]的长度为k-1的路径存在。
让我们检查具有索引i和j的两个顶点v1,v2。
如果它们之间存在长度为k的路径,则为v1->...->u->v2。让u的索引为m。
从归纳假设可知,因为有一条路径,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
,则对于所有 m
,A[m][j] = 0
。
如果我们将其分配在定义 A^k[i][j]
的总和中,我们得到 A^k[i][j] = 0
证毕
小提示:技术上,A^k[i][j]
是长度恰好为 k
的路径数。这可以类似地证明,但需要更多的细节注意。
为了避免数字增长过快(这会增加 M(n)
,因为您可能需要大整数来存储该值),并且由于您只关心除 0/1 外的值 - 您可以将矩阵视为布尔值 - 仅使用 0/1 值并修剪任何其他内容。