【问题标题】:Path Queries on a Tree树上的路径查询
【发布时间】:2021-09-20 18:55:56
【问题描述】:

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

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

【问题讨论】:

  • 我想既然您正在寻找预处理,您可以尝试使用 prims 或 kruskals 算法来获得最小生成树。这应该有助于加快您的 DFS。
  • @JaisonThomas 树的最小生成树?你确定吗?

标签: c++ algorithm graph graph-theory graph-algorithm


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      • 1970-01-01
      相关资源
      最近更新 更多