您的位置:首页 > 其它

ZOJ 3201 Tree of Tree

2014-02-05 16:40 375 查看
树形背包。。。

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 1
10 20 30
0 1
0 2
3 2
10 20 30
0 1
0 2


Sample Output

30
40


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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: