ZOJ 3201 Tree of Tree


树形DP。。。。

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
Source: ZOJ Monthly, May 2009 


#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

int dp[200][200],valu[200],cnt[200],ans,N,K;
vector<int> g[200];

int dfs(int u,int fa)
{
    cnt=1;
    for(int i=0;i<g.size();i++)
    {
        int v=g;
        if(v==fa) continue;
        cnt+=dfs(v,u);
    }
    for(int k=0;k<g.size();k++)
    {
        int v=g[k];
        if(v==fa) continue;
        for(int i=cnt;i>=1;i--)
        {
            for(int j=0;j<i&&j<=cnt[v];j++)
                dp=max(dp,dp[i-j]+dp[v][j]);
        }
    }
    if(cnt>=K)
    {
        ans=max(ans,dp[K]);
    }
    return cnt;
}

int main()
{
    while(scanf("%d%d",&N,&K)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        for(int i=0;i<N;i++)
        {
            scanf("%d",valu+i);
            dp[1]=valu;
            g.clear();
        }
        for(int i=0;i<N-1;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            g[a].push_back(b);
            g.push_back(a);
        }
        ans=0;dfs(0,-1);
        printf("%d ",ans);
    }
    return 0;
}
* This source code was highlighted by YcdoiT. ( style: Emacs )

原文地址:https://www.cnblogs.com/CKboss/p/3350824.html