比赛 202504月赛 评测结果 AWWWW
题目名称 搜城探宝 最终得分 20
用户昵称 zjzhe 运行时间 0.015 s
代码语言 C++ 内存使用 3.36 MiB
提交时间 2025-04-22 15:59:13
显示代码纯文本
//#include<bits/stdc++.h>
//#define int long long
//using namespace std;
//const int N=20;
//int n,k,w[N],f[N][N];
//vector<int>lk[N];
//void dfs(int u,int fa){
//	f[u][1]=w[u];
//	for(int v:lk[u]){
//		if(v==fa)continue;
//		dfs(v,u);
//		for(int i=k;i>=1;i--){
//			for(int j=0;j<i;j++){
//				f[u][i]=max(f[u][i],f[u][i-j]+f[v][j]);
//			}
//		}
//	}
//}
//#undef int
//int main(){
//#define int long long
//	cin>>n>>k;
//	for(int i=1;i<n;i++){
//		int x,y;cin>>x>>y;
//		lk[x].push_back(y);lk[y].push_back(x);
//	}
//	for(int i=1;i<=n;i++)cin>>w[i];
//	dfs(1,0);
//	
//	
//	return 0;
//}

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=20;
int n,k,w[N],f[N][N];
vector<int>lk[N],vec;
bitset<N>vs;
int solve(int u,int f,int kk,int rt){
	if(kk==0)return 0;
	vs[u]=1;
	if(kk==1)return w[u];
	if(lk[u].size()==1){
		if(rt==u)return solve(lk[u][0],u,kk-1,rt)+w[u];
		else return w[u];
	}
	if(lk[u].size()==2){
		if(u==rt){
			int lc=lk[u][0],rc=lk[u][1];
			int ans=0;
			for(int i=0;i<=kk-1;i++){
				ans=max(ans,solve(lc,u,i,rt)+solve(rc,u,kk-i-1,rt));
			}
//			if(ans==solve(lc,u,0,rt)+solve(rc,u,kk-1,rt))vs[lc]=0;
//			if(ans==solve(lc,u,kk-1,rt)+solve(rc,u,0,rt))vs[rc]=0;
			return ans+w[u];
		}else {
			if(lk[u][0]==f)return solve(lk[u][1],u,kk-1,rt)+w[u];
			else return solve(lk[u][0],u,kk-1,rt)+w[u];
		}
	}
	int lc,rc;
	if(lk[u][0]==f)lc=lk[u][1],rc=lk[u][2];
	else if(lk[u][1]==f)lc=lk[u][0],rc=lk[u][2];
	else if(lk[u][2]==f)lc=lk[u][0],rc=lk[u][1];
	int ans=0;
	for(int i=0;i<=kk-1;i++){
		ans=max(ans,solve(lc,u,i,rt)+solve(rc,u,kk-i-1,rt));
	}
//	if(ans==solve(lc,u,0,rt)+solve(rc,u,kk-1,rt))vs[lc]=0;
//	if(ans==solve(lc,u,kk-1,rt)+solve(rc,u,0,rt))vs[rc]=0;
	return ans+w[u];
}

#undef int
int main(){
#define int long long
	freopen("hzoi_key.in","r",stdin);
	freopen("hzoi_key.out","w",stdout);
	cin>>n>>k;
	for(int i=1;i<n;i++){
		int x,y;cin>>x>>y;
		lk[x].push_back(y);lk[y].push_back(x);
	}
	for(int i=1;i<=n;i++)cin>>w[i];
	int ans=0;
	for(int i=1;i<=n;i++){
		if(!vs[i])ans=max(ans,w[i]); 
	}
	cout<<solve(1,0,k,1)+ans<<'\n';
	return 0;
}