Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10898 | Accepted: 3661 |
Description
Input
Each test case contains three parts.
The first part is two numbers N K, whose meanings we have talked about just now. We denote the nodes by 1 2 ... N. Since it is a tree, each node can reach any other in only one route. (1<=N<=100, 0<=K<=200)
The second part contains N integers (All integers are nonnegative and not bigger than 1000). The ith number is the amount of apples in Node i.
The third part contains N-1 line. There are two numbers A,B in each line, meaning that Node A and Node B are adjacent.
Input will be ended by the end of file.
Note: Wshxzt starts at Node 1.
Output
Sample Input
2 1 0 11 1 2 3 2 0 1 2 1 2 1 3
Sample Output
11 2
#include<stdio.h>
#include<string.h>
int n,k,a[201],c,d,to[401],head[401],next[401],idx,f[2][201][201],ans;
int max(int x,int y)
{
if(x>y)
return x;
return y;
}
void dfs(int from,int p)
{
for(int i=head[p];i;i=next[i])
{
if(to[i]!=from)
{
dfs(p,to[i]);
for(int j=k;j>=1;j--)
for(int z=1;z<=j;z++)
{
f[0][p][j]=max(max(f[0][p][j],f[1][p][j-z]+f[0][to[i]][z-1]),f[0][p][j-z]+f[1][to[i]][z-2]);
f[1][p][j]=max(f[1][p][j],f[1][p][j-z]+f[1][to[i]][z-2]);
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
idx=0;
memset(f,0,sizeof(f));
memset(head,0,sizeof(head));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
for(int j=0;j<=k;j++)
f[0][i][j]=f[1][i][j]=a[i];
}
for(int i=1;i<n;i++)
{
scanf("%d%d",&c,&d);
++idx;
to[idx]=d;
next[idx]=head[c];
head[c]=idx;
++idx;
to[idx]=c;
next[idx]=head[d];
head[d]=idx;
}
dfs(0,1);
printf("%d\n",max(f[0][1][k],f[1][1][k]));
}
}