为每个查询在图形中的u和v节点之间找到路径(最小/最大/唯一)

时间:2019-05-29 14:02:39

标签: algorithm data-structures

https://www.hackerearth.com/challenges/hiring/sap-labs-java-hiring-challenge/algorithm/micro-and-internship-10/description/

在如上所述的基于查询的问题中,每次必须在两个节点之间查找路径并对该路径执行一些操作时,应该采取什么方法?我已经尝试过DFS,但是它给出了运行时错误以及超过时间限制。

DFS算法

1 个答案:

答案 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个节点uv,而我们想在路径中找到最小权重,则相当于找到从u到{{1 }},以及从LCA(u,v)v的最小权重。

这有什么用?使用稀疏表,而不是仅保存节点跳高LCA(u,v)会去的地方,我们还保存路径的最小边,那么我们可以简单地以h复杂度回答每个查询。 / p>

这同样暗示了这个问题,但是没有存储最小值,而是像我在第一种方法中说明的那样,我们得到了一个布尔数组,其中如果存在边,则O(log n)的值为i-th当我们跳高1并跳高i时,重量h的重量。使用此数组,您应该能够回答每个查询。

由于我们要遍历布尔数组,因此该解决方案在回答查询时会进行0个操作。