给定一个树的N个顶点编号从1到N.顶点1是树的根。为每个顶点分配整数权重。删除操作可以删除以任意顶点u为根的子树。我们必须使用删除操作,以便剩余顶点的总权重(值的总和)最大。例如:
1
/ \
1 -1 (Remove)
/ \
(Remove) -1 -1
所以2允许删除操作,使得权重大于前一个。
如何处理这类使用算法的问题,因为树中的节点可以有两个以上的分支。
我的方法:首先我发现每个节点的重量,即
-1
/ \
0 -2
/ \
-1 -1
代码:
static int search(int a,ArrayList<Integer>[] som){
int sum=0;
check[a]=true;
for(int j=0;j<som[a].size();j++){
weight[a] = value[a];
if(!check[som[a].get(j)])
{
weight[a]+= search(som[a].get(j),som);
}
}
return weight[a];
}
我不知道如何在此之后进行处理,动态编程是否有用,请提供一些算法或任何方法。
答案 0 :(得分:0)
你可以在这里使用某种动态
让我们说
d[i] - maximum sum for subtree starting from vertex i
所以
d[i] = max(0, a[i] + those children of vertex i whose d[] > 0)
将在dfs期间离开顶点时计算(与重量相同)
因此,对于您的示例树,d看起来像
2(5)
/ \
1(2) 0(4)
/ \
0(1) 0(3)
括号是订单