ZJU 3201 Tree of Tree 树状DP

探讨了在一个带有节点权重的树形结构中寻找指定大小的最大子树的问题。通过深度优先搜索(DFS)算法实现解决方案,并详细展示了核心代码片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Tree of Tree


Time Limit: 1 Second      Memory Limit: 32768 KB

You're given a tree with weights of each node, you need to find the maximum subtree of specified size of this tree.

Tree Definition
A tree is a connected graph which contains no cycles.

Input

There are several test cases in the input.

The first line of each case are two integers N(1 <= N <= 100), K(1 <= K <= N), where N is the number of nodes of this tree, and K is the subtree's size, followed by a line with N nonnegative integers, where the k-th integer indicates the weight of k-th node. The following N - 1 lines describe the tree, each line are two integers which means there is an edge between these two nodes. All indices above are zero-base and it is guaranteed that the description of the tree is correct.

Output

One line with a single integer for each case, which is the total weights of the maximum subtree.

Sample Input

3 1
10 20 30
0 1
0 2
3 2
10 20 30
0 1
0 2

Sample Output

30
40

Author: LIU, Yaoting

 

 

 

这个题目是无向图,而且是任何一个点都可能是根节点,这个程序算出来的任何F[I][K]都是以I为根节点的最大值,呵呵

 

关键代码

 

void dfs(int idx)

{

    for(int i=bug[idx]; i<=m; i++)

        dp[idx][i]=p[idx];//初始化数组

    used[idx]=1;//标记,以便剪枝

    for(int i=0; i<num[idx]; i++)

    {

        if(used[map[idx][i]]) continue;

        dfs(map[idx][i]);//直到搜索到叶子节点

        for(int j=m; j>=bug[idx]; j--)

            for(int k=1; k<=j-bug[idx]; k++)

                if(dp[idx][j]<dp[idx][j-k]+dp[map[idx][i]][k])

                    dp[idx][j]=dp[idx][j-k]+dp[map[idx][i]][k];

    }

}

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值