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