Algorithm 值小于k的树中两个节点之间奇数值边的和

Algorithm 值小于k的树中两个节点之间奇数值边的和,algorithm,data-structures,tree,microsoft-distributed-file-system,Algorithm,Data Structures,Tree,Microsoft Distributed File System,我的同事问了我这个问题,但我无法提出任何最佳解决方案。 给定一个无向加权树,其中包含n个节点、n-1条边和q个查询。 每个查询都输入u v k,输出路径u到v中具有奇数值且小于k的边的总和。 P>1>P,这取决于你所考虑的“最佳解决方案”和环境情况。给定N这取决于你所考虑的“最佳解决方案”和环境情况。给定n由于输入是一棵树,因此任意两个节点之间只有一条路径。您可以使用u和v之间的生成路径。然后通过

我的同事问了我这个问题,但我无法提出任何最佳解决方案。
给定一个无向加权树,其中包含n个节点、n-1条边和q个查询
每个查询都输入u v k,输出路径u到v中具有奇数值且小于k的边的总和。


P>1>P,这取决于你所考虑的“最佳解决方案”和环境情况。给定N

这取决于你所考虑的“最佳解决方案”和环境情况。给定n由于输入是一棵树,因此任意两个节点之间只有一条路径。您可以使用

u
v
之间的生成路径。然后通过
过滤路径上的边。把数字加起来。这需要
O(n)
时间

编辑由于存在多个查询,因此有必要对树进行预处理。任何树都可以生根。然后您可以遍历树并更新值,如
遍历
中所示。您将
(root,v)
查询的答案存储在每个节点上。这将帮助您回答任何其他问题

'''
Node 
    - parent
    - children
    - value 
    - name 
'''

def traverse(node):
    for child in node.children:
        if w(node, child) < k and w(node, child) % 2 == 1:
            child.value = node.value + w(node, child)
        traverse(child) 


root.value = 0
traverse(root, 0)

看起来在
O(n log n)
预处理后,您可以回答
O(log n)

中的查询,因为输入是一棵树,所以任意两个节点之间只有一条路径。您可以使用
u
v
之间的生成路径。然后通过
过滤路径上的边。把数字加起来。这需要
O(n)
时间

编辑由于存在多个查询,因此有必要对树进行预处理。任何树都可以生根。然后您可以遍历树并更新值,如
遍历
中所示。您将
(root,v)
查询的答案存储在每个节点上。这将帮助您回答任何其他问题

'''
Node 
    - parent
    - children
    - value 
    - name 
'''

def traverse(node):
    for child in node.children:
        if w(node, child) < k and w(node, child) % 2 == 1:
            child.value = node.value + w(node, child)
        traverse(child) 


root.value = 0
traverse(root, 0)

看起来在
O(n log n)
预处理后,您可以在
O(log n)
中回答查询。非常抱歉,我的问题有一个输入错误,实际上这是1的约束条件,我的意思是最佳解决方案,编码人员通常在编码竞赛中做什么,因为在一天结束时,都是关于在给定时间限制内解决测试用例的优化解决方案我真的很抱歉,我的问题中有一个输入错误,实际上这是1的约束,我指的是优化解决方案,编码人员通常在编码竞赛中做什么,因为在一天结束时,都是关于在给定的时间限制内解决测试用例的优化解决方案。事实上,这是我想到的第一个解决方案,这是一个简单的解决方案,每个查询的复杂度应该是logn或logn^2或稍高一点,即对数时间。您的解决方案的总复杂度为O(qn),这肯定会超过时间限制。哦,有多个查询!让我再想想。在预处理过程中,我认为您假设k是常数,但在每个查询中都会有所不同。PS:不知何故,我认为每个查询的复杂性将是(logn)^2Oh。需要更多的思考:)你好,普拉蒂克。事实上,这是我想到的第一个解决方案,这是一个简单的解决方案,每个查询的复杂度应该是logn或logn^2或稍高一点,即对数时间。您的解决方案的总复杂度为O(qn),这肯定会超过时间限制。哦,有多个查询!让我再想想。在预处理过程中,我认为您假设k是常数,但在每个查询中都会有所不同。PS:不知何故,我认为每个查询的复杂性将是(logn)^2Oh。需要更多的思考:)
def query(u, v):
    return u.value + v.value - 2 * lca(u, v).value