比赛 |
20241128 |
评测结果 |
AAAAAAAAAA |
题目名称 |
外卖 |
最终得分 |
100 |
用户昵称 |
flyfree |
运行时间 |
0.411 s |
代码语言 |
C++ |
内存使用 |
4.87 MiB |
提交时间 |
2024-11-28 11:01:41 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 510
inline ll read(){
ll 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*10+c-'0';
c=getchar();
}
return x*f;
}
ll dp[MAXN][MAXN],val[MAXN],f[MAXN][MAXN],ans[MAXN];
ll n,m,idx;
ll hd[MAXN],ed[MAXN*2],nxt[MAXN*2];
vector <ll> vec;
void dfs(ll now,ll fa){
// dp[now][1]=val[now],f[now][1]=val[now];
for(int i=hd[now];i;i=nxt[i]){
ll y=ed[i];
if(y==fa)continue;
dfs(y,now);
// if(now==1)continue;
for(int j=m;j;j--){
for(int u=j;u;u--){
if(u>2)dp[now][j]=max(dp[now][j],dp[now][j-u]+dp[y][u-2]),f[now][j]=max(f[now][j],f[now][j-u]+dp[y][u-2]);
f[now][j]=max(f[now][j],dp[now][j-u]+max(dp[y][u-1],f[y][u-1]));
}
}
}
for(int i=m;i;i--){
dp[now][i]=max(dp[now][i],dp[now][i-1]+val[now]);
f[now][i]=max(f[now][i],f[now][i-1]+val[now]);
}
// cout<<now<<" ";
// for(int i=1;i<=m;i++)cout<<dp[now][i]<<" ";
// cout<<endl;
}
void build(ll x,ll y){
nxt[++idx]=hd[x];
ed[idx]=y;
hd[x]=idx;
}
int main(){
freopen("food.in","r",stdin);
freopen("food.out","w",stdout);
n=read(),m=read();
for(int i=1;i<=n;i++)val[i]=read();
for(int i=1;i<n;i++){
ll x=read(),y=read();
build(x,y);
build(y,x);
if(x==1||y==1)vec.push_back(x==1?y:x);
}
dfs(1,0);
// cout<<dp[1][m];
ll ansz=0;
// for(int i=0;i<vec.size();i++){
// memset(ans,0,sizeof(ans));
// for(int j=0;j<vec.size();j++){
// if(i==j)continue;
// }
// }
for(int i=1;i<=m;i++)ansz=max(ansz,max(dp[1][i],f[1][i]));
cout<<ansz;
return 0;
}