ZOJ 3201 Tree of Tree

来源:互联网 发布:淘宝宝贝怎么发布 编辑:程序博客网 时间:2024/05/17 20:24

树形背包。。。

Tree of Tree
Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %lld & %llu

[Submit]   [Go Back]   [Status]  

Description

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 110 20 300 10 23 210 20 300 10 2

Sample Output

3040

Source

ZOJ Monthly, May 2009

[Submit]   [Go Back]   [Status]  


#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int INF=0x3f3f3f3f;int Adj[200],Size;struct E{    int to,next;}Edge[40000];void init(){    Size=0;    memset(Adj,-1,sizeof(Adj));}void Add_Edge(int u,int v){    Edge[Size].to=v;    Edge[Size].next=Adj[u];    Adj[u]=Size++;}int n,K,dp[200][200];void dfs(int f,int u){    for(int i=Adj[u];~i;i=Edge[i].next)    {        int v=Edge[i].to;        if(v==f) continue;        dfs(u,v);        for(int j=K;j>=1;j--)        {            for(int k=1;k<j;k++)            {                dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);            }        }    }}int main(){while(scanf("%d%d",&n,&K)!=EOF){    init();    memset(dp,0,sizeof(dp));    for(int i=0;i<n;i++) scanf("%d",&dp[i][1]);    for(int i=0;i<n-1;i++)    {        int u,v;        scanf("%d%d",&u,&v);        Add_Edge(u,v);        Add_Edge(v,u);    }    dfs(-1,0);    int ans=-INF;    for(int i=0;i<n;i++)        ans=max(ans,dp[i][K]);    printf("%d\n",ans);}    return 0;}



0 0
原创粉丝点击