题目分析:
Code:
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
using namespace std;
#define maxn 110
#define maxk 210
int f[maxn][maxk][3],n,m,w[maxn],head[maxn],size;
struct edge {
int v,nxt;
}e[maxn<<1];
inline int read_() {
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=(x<<1)+(x<<3)+c-'0';
c=getchar();
}
return x*f;
}
inline void clean_() {
memset(f,0,sizeof(f));
memset(head,-1,sizeof(head));
size=0;
}
inline void add_(int u,int v) {
e[++size].v=v;
e[size].nxt=head[u];
head[u]=size;
}
void dfs_(int u,int fa) {
for(int i=0;i<=m;++i) f[u][i][0]=f[u][i][1]=w[u];
for(int i=head[u];~i;i=e[i].nxt) {
int v=e[i].v;
if(v==fa) continue;
dfs_(v,u);
for(int j=m;j>=1;--j) {
for(int k=1;k<=j;++k) {
f[u][j][0]=max(f[u][j][0],f[u][j-k][1]+f[v][k-1][0]);
f[u][j][0]=max(f[u][j][0],f[u][j-k][0]+f[v][k-2][1]);
f[u][j][1]=max(f[u][j][1],f[u][j-k][1]+f[v][k-2][1]);
}
}
}
}
void readda_() {
int x,y;
while(scanf("%d%d",&n,&m)!=EOF) {
clean_();
for(int i=1;i<=n;++i) w[i]=read_();
for(int i=1;i<n;++i) {
x=read_();y=read_();
add_(x,y);add_(y,x);
}
dfs_(1,0);
printf("%d\n",max(f[1][m][0],f[1][m][1]));
}
}
int main() {
readda_();
return 0;
}