对树的距离查询

问题描述 投票:3回答:1

我们得到了一个具有n个顶点的树,其中一些顶点充当“热点”。

我们必须回答类型(a,b,c)的多个查询,这意味着我们必须找到距c最近的热点的距离,以使我们不会穿过节点a和b之间的边缘。

我已经尝试过许多数据结构,例如在树上使用最低的共同祖先,并且使用过类似mo's算法的算法,但我也尝试过处理最接近根的查询,但是这些都没有给我每个查询所需的复杂度,在O(1)到O(log(n))之间的任何位置。

是否可以使用更好的算法或一些巧妙的预计算(比O(nlogn)少的时间)来解决此问题?

algorithm data-structures graph tree graph-algorithm
1个回答
0
投票

将所有热点合并到单个节点h(代替树-输入现在是图形)。这个问题可以表示如下:

给定无向图G和节点h(合并热点),我们要回答查询Q(c,e)

Q(c,e):给定节点cG和边eG,返回距离h c)在G \ {e}中。

这是一个动态问题,或更具体地说:边缘递减的单源最短路径距离问题(也称为单源边缘去除的精确距离预言”)。

在[1]中,预处理时间为O(mn ^ 1.5 + n ^ 2.5 * logn),查询时间为O(1)。这是一种全对最短路径算法,而您只需要一个单源算法。

[2]将结果改进为O(σ^ 0.5 * n ^ 1.5)预处理时间和O(1)查询时间。 σ是来源数(在您的情况下:σ= 1-合并的热点)。

[2之后,您可以使用O(n ^ 1.5)内存获得O(n ^ 1.5)预处理时间和O(1)查询时间。

© www.soinside.com 2019 - 2024. All rights reserved.