如何回答DAG上最长权重路径的单节点编辑查询

时间:2015-02-08 15:42:12

标签: algorithm graph-algorithm directed-acyclic-graphs

正式地,我们给出了一个图表G,其中'n'个节点上都有+ ve个数字。我们得到没有循环的有向边。然后我们被要求回答Q查询,每个查询要求在G上编辑节点的权重,我们必须打印最长权重路径的权重。请注意,每个查询都意味着从原始图形编辑单个节点。 N <= 10 ^ 5&amp; Q&lt; = 10 ^ 6。什么是最有效的解决方案?

当然暴力将采取太多的O(n q)。我尝试了2,3种不同的暴力,它提供了更好的平均时间复杂度,但我可以找到每种解决方案的至少一个测试数据,如果我们反复询问与O(n q)一样糟糕。

1 个答案:

答案 0 :(得分:0)

为了在每个O(1)时间内回答查询,对每个节点来说,知道不使用该节点的最重路径的权重就足够了,因为这些类中的路径权重受到影响。通过改变节点的重量。 “使用”一半是在O(n)时间内直接完成的,例如,为每个节点计算该节点作为源/接收器的最重路径的权重。

“不使用”一半是让这个问题变得有趣的原因。假设节点按拓扑顺序编号为1..n,弧从低到高指向。使用之前的计算数据,给定弧u-> v,我们可以在O(1)时间内计算包括该弧的最重路径的权重。这样的路径肯定会跳过节点u + 1..v-1,因此我们可以相应地更新这些节点的“不使用”最大值。如果我们对所有弧进行此操作,包括从权重为0到1..n的哨兵源0到权重为0的哨兵接收器n + 1的一些哨兵弧,那么我们得到正确的“不使用”值。 / p>

现在,以明显的方式执行此操作太慢:O(mn)时间用于预处理总时间为O(mn + q),其中m是弧的数量,n是节点数, q是查询数。段树将预处理时间减少到O(m log n)。