Algorithm 加权无向树的最大利润

Algorithm 加权无向树的最大利润,algorithm,data-structures,graph,dynamic-programming,maximize,Algorithm,Data Structures,Graph,Dynamic Programming,Maximize,我在做样本测试时遇到了这个问题。问题是我们给出了一棵无向树。我们可以从我们选择的任何节点开始。最初,我们有功率“P”,在从一个节点到另一个节点的过程中,我们失去了一些功率“X”(视为旅行成本),并赚取了一些利润“Y”。 因此,我们需要知道,在给定的功率下,我们能获得的最大利润是多少 示例:第一行包含节点数和初始功率 接下来的n-1行包含节点成本利润 5.4 1 2 1 2 1 3 2 3 1 4 2 4 4 5 2 2 答案=>7。我们可以从4开始,到1,然后再到3 我已经将DFS应用于此,以通

我在做样本测试时遇到了这个问题。问题是我们给出了一棵无向树。我们可以从我们选择的任何节点开始。最初,我们有功率“P”,在从一个节点到另一个节点的过程中,我们失去了一些功率“X”(视为旅行成本),并赚取了一些利润“Y”。 因此,我们需要知道,在给定的功率下,我们能获得的最大利润是多少

示例:第一行包含节点数和初始功率

接下来的n-1行包含节点成本利润

5.4

1 2 1 2

1 3 2 3

1 4 2 4

4 5 2 2

答案=>7。我们可以从4开始,到1,然后再到3

我已经将DFS应用于此,以通过遍历每一条路径获得最大利润

但是有没有办法减少时间

从集合导入defaultdict
类树:
定义初始化(自身,节点):
self.nodes=节点
self.graph=defaultdict(列表)
def添加(自身、a、b、费用、利润):
self.graph[a].追加([b,费用,利润])
self.graph[b].追加([a,费用,利润])
def启动(自身、电源):
maxi=-1
visited=[范围内的i为False(self.nodes)]
对于范围内的i(1,self.nodes+1):
功率=功率
已访问[i-1]=真
对于self.graph[i]中的j:
temp=自我dfs(j,功率,0,已访问)
如果温度>最大值:
最大值=温度
访问[i-1]=错误
返回最大值
def dfs(自身、节点、权力、利润、访问):
v、 p,pro=节点[0],节点[1],节点[2]
如果幂-p<0:
返回0
如果幂-p==0:
回报利润+利润
利润+=专业
powers=powers-p
已访问[v-1]=真
速度=利润
对于自组织图[v]中的k:
如果访问[k[0]-1]==False:
temp=自我dfs(k、功率、速度、访问)
如果温度>利润:
利润=临时工
已访问[v-1]=错误
利润回报
t=树(5)
t、 添加(1,2,1,2)
t、 添加(1,3,2,3)
t、 添加(1,4,2,4)
t、 添加(4,5,2,2)
打印(t.start(4))

您希望找到长度小于等于p的所有路径,并最大限度地利用它们的利润。您可以使用质心分解在O(n log^2 n)时间内实现它

考虑通过从树中删除质心C创建的所有子树。假设你发现所有路径的长度小于或等于p,并取最大值(现在你只考虑包含C的路径)。使用DFS计算从C到树中其他节点的距离和利润,并将它们成对存储在multiset中

对于每个子树,请执行以下操作:

  • 从multiset中删除该子树中节点的每对值-O(n log n)

  • 将所有对从multiset复制到列表L1-O(n)

  • 从当前子树创建对的列表L2(距离、利润),并按距离按降序排序-O(n log n)

  • 创建变量maxx=0和i=0

  • 对于L2中的每对X:

    • 而L1[i]