查找单个节点的主导者列表(相对于单个入口节点)?

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

在Tar​​jan的算法上有许多资源可以找到关于单个入口节点的支配树。但是,我只想找到树的单个节点的支配者。

有没有比使用Tarjan的O(m log n)时间算法更简单的方法来计算支配树,然后我们遍历树来查找特定节点的支配者?对于单节点情况,我想比O(m log n)时间更快地完成此操作。

performance
1个回答
1
投票

虽然我不知道有任何现有算法可以做到这一点,但我可以想到一个。

让入口节点为根,目标节点(找到其支配者)为t。创建一个以root为根的DFS树。

现在请注意,t的支配者集合是DFS树上t的祖先的子集,并且只有前向边和交叉边可以“避免”从根到t的路径上的那些节点。所以:

  • 对于每个节点节点,让f(节点)成为t的最高祖先,它可以到达节点而不会在t的任何其他祖先上行走。这可以通过记忆来计算线性时间。
  • 对于每个交叉边x→y,其中y是t的祖先,所有作为f(x)的严格继承者和y的严格祖先的节点都不是t的支配者。 (因为路径根→...→f(x)→...→x→y→...→t不通过这些节点)

算法(O(n + m))将是:

  • 以根为根目录创建DFS树。
  • 将所有t的祖先标记为“可能的候选人”。
  • 计算所有节点的f(节点)。
  • 对于如上所述的每个x→y,使用求和表在O(1)时间内将路径f(x)→...→y(不包括端点)中的节点列表标记为“不能是支配者”。 (类似于总面积表但在1D中)
  • 剩下的候选人是统治者。

不确定这是否更容易。

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