树上的路径查询

问题描述

给定一棵树和要回答的 Q查询。在每个查询中,您将获得 2 个节点 u & v。您应该返回路径,例如 u -> v1 -> v2... -> v

我有一种天真的方法来为每个查询执行 DFS,但可以做得更好吗?是否可以进行任何类型的预处理? (我是图表新手!如果我在某处出错,请帮助我并纠正我)

解决方法

我假设在每个树节点上都有父节点,您也可以使用它在树中向上移动。

有了这个假设,这个问题似乎就是寻找最低共同祖先的问题。这是一个标准问题,你可以很容易地在网上找到如何解决它。

一旦你有最低共同祖先,你的路径将来自 u-->-->v

只要找到最低的共同祖先,你就会明白进一步的算法。

,

如果没有更新,您可以简单地在每个节点中存储到树根的路径。然后,如果您需要从节点 a 到 b 的路径,则以这种方式表示路径

a b = a LCA(a,b) + b LCA(a,b)
(您可以使用 Sparse Table 在 O(1) 时间内找到 LCA)

问题是这对你有什么帮助...
看看 - 如果你有从 LCA(a,b) 到树根的路径和从 a 到根的路径 - 从 a 到 LCA(a,b) 的路径很简单

root LCA(a,b) - root a。
计算从 LCA(a,b) 到 b 的路径的方法相同,而从 a 到 b 的路径是这两者的总和。

如果对 LCA 使用稀疏表,则整个方法的预处理时间为 O(n),每个查询的时间为 O(1)。