在如上所述的基于查询的问题中,每次必须在两个节点之间查找路径并对该路径执行一些操作时,应该采取什么方法?我已经尝试过DFS,但是它给出了运行时错误以及超过时间限制。
DFS算法
答案 0 :(得分:0)
首先让我们为每个查询使用常规dfs解决问题。我们需要一个长度为100的布尔数组V
(因为每个节点上的值不能超过100),并且如果V[a[u]]
(其中u
是当前节点,则遍历每个节点时)节点)设为0
并将其设置为1
并增加答案。
现在要解决类似的问题,例如在两个节点之间查找最小边缘,我们需要使用稀疏表,如果您不知道什么,该表也可以用于查找 LCA 建议您在https://www.hackerrank.com/topics/lowest-common-ancestor(第3部分)上阅读此表。简而言之,这是通过O(log n)
预处理在O(nlogn)
中查找LCA的一种方法。
如果我们取2个节点u
和v
,而我们想在路径中找到最小权重,则相当于找到从u
到{{1 }},以及从LCA(u,v)
到v
的最小权重。
这有什么用?使用稀疏表,而不是仅保存节点跳高LCA(u,v)
会去的地方,我们还保存路径的最小边,那么我们可以简单地以h
复杂度回答每个查询。 / p>
这同样暗示了这个问题,但是没有存储最小值,而是像我在第一种方法中说明的那样,我们得到了一个布尔数组,其中如果存在边,则O(log n)
的值为i-th
当我们跳高1
并跳高i
时,重量h
的重量。使用此数组,您应该能够回答每个查询。
由于我们要遍历布尔数组,因此该解决方案在回答查询时会进行0
个操作。