图中的每个边都具有1的权重.图可以具有周期,如果节点具有自循环,则它可以是从0到无穷大的任何距离,具体取决于编号.我们采取自我循环的时间.
我已经使用bfs解决了这个问题,但是对距离的约束是10 ^ 9的顺序,因此bfs很慢.
我们将在表单的给定图表上询问多个查询
(距离,来源)
o / p是从源顶点开始精确位于给定距离的节点列表.
约束
1<=Nodes<=500
1<queries<=500
1<=distance<=10^9
我有一种感觉,会有很多重复的计算作为没有.节点很小,但我无法弄清楚如何在较小的问题中减少问题.
有效的方法是什么?
编辑:我已经尝试过使用矩阵求幂,但对于给定的约束,它太慢了.问题的时间限制为1秒.
最佳答案 设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的路径.
让我们检查具有索引i和j的两个顶点v1,v2.
如果它们之间存在长度为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]>对于所有m,0然后A [m] [j] = 0.
如果我们在定义A ^ k [i] [j]的和中分配它,我们得到A ^ k [i] [j] = 0
QED
小注释:从技术上讲,A ^ k [i] [j]是i和j之间的路径数,长度恰好为k.这可以证明与上面类似,但更多地关注细节.
为了避免数字增长太快(这会增加M(n),因为你可能需要大整数来存储该值),并且因为你不关心0/1以外的值 – 你可以将矩阵视为布尔值 – 仅使用0/1值并修剪其他任何值.