比赛 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;
}