最近我在树上遇到了这个问题,我在O(n * q)中找到了解决方案。我在想是否有更好的方法可以用较小的复杂性处理这个问题。
问题如下:
给出一个未加权的树' n'节点(n> = 1且n可以到10 5 ),其节点可以是特殊的或非特殊的。节点1始终是特殊的,最初不是特殊的。现在,有两个操作:
1.我们可以通过 " U Node_Number"
的更新操作将任何非特殊节点更新到特殊节点OR
2.任何时候,我们都可以询问用户 " Q Node_Number" 哪个应该在最接近"的树中返回该特殊节点。 Node_Number"
这些操作也可以达到10 5 。
我的解决方案:
我想到了创建邻接列表。对于操作1,我可以通过布尔标志保持特殊或非特殊记录。但是对于操作2,我的解决方案包括每当" Q Node_Number"被要求服用" Node_Number"以root身份开始我的BFS。
但复杂性是二次的。这是解决这个问题的最佳方式吗?
答案 0 :(得分:1)
这是通过sqrt分解的O(n ^ 1.5 + n ^ 0.5 q)时间算法。我们需要一个恒定时间距离oracle(这基本上是最不常见的祖先)。这个想法是,每个n ^ 0.5次节点变得特殊,从所有特殊节点执行广度优先搜索,这为树中的每个节点产生当前特殊的最近节点。在每个查询中,取最接近的(i)最后一个广度优先搜索时特殊的节点(ii)最多n ^ 0.5个新特殊节点。
正如我在评论中提到的,我希望通过top trees有一个非常复杂的O((n + q)log n)-time算法。