题目 代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int home[501];
int f[501];
int ba[501];
int cnt=1;
int n,m;
template<typename zqw>void qr(zqw &x){
bool f=x=0;
char c=getchar();
while(!isdigit(c)) f|=c=='-',c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
x=f?-x:x;
return ;
}
inline void write(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9) write(x/10);
putchar(x%10+48);
}
struct node {
int next,to;
}e[1000];
inline void putin(int a,int b){
e[cnt].next=home[a];
e[cnt].to=b;
home[a]=cnt++;
}
int dp[501][1001][2];
void hou(int x){
for (int i=home[x];i!=0;i=e[i].next){
if(e[i].to!=ba[x]){
ba[e[i].to]=x;
hou(e[i].to);
}
else continue;
for(int j=m;j>=0;j--){
for(int k=m;k>=0;k--){
if(k + j + 2 <= m) dp[x][j+k+2][0] = max(dp[x][j+k+2][0],dp[x][j][0]+dp[e[i].to][k][1]);
dp[x][j+k+2][1] = max(dp[x][j+k+2][1],dp[x][j][1]+dp[e[i].to][k][1]);
if(k + j + 1 <= m) dp[x][j+k+1][0] = max(dp[x][j+k+1][0],dp[x][j][1]+dp[e[i].to][k][0]);
}
}
}
for(int i = m;i >= 1;i--) {
dp[x][i][1] = max(dp[x][i][1],dp[x][i-1][1]+f[x]),
dp[x][i][0] = max(dp[x][i][0],dp[x][i-1][0]+f[x]);
}
}
signed main(){
qr(n);
qr(m);
ba[1]=1;
for(int i=1;i<=n;i++) qr(f[i]);
for(int i=1;i<n;i++){
int a,b;
qr(a);
qr(b);
putin(a,b);
putin(b,a);
}
hou(1);
write(dp[1][m][0]);
return 0;
}