在树中搜索

时间:2014-10-15 17:43:00

标签: algorithm

给定一个树的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];


 }

我不知道如何在此之后进行处理,动态编程是否有用,请提供一些算法或任何方法。

1 个答案:

答案 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)

括号是订单

相关问题