题解:P12343 [蓝桥杯 2025 省 AB/Python B 第二场] 树上寻宝
因为小蓝每步可以走最多
对于每个深度
通过上面这样的走法,所有深度不超过
一些需要注意的地方:
- 存图的时候记得双向存边。
- 根节点的价值也要算入答案。
- 答案可能会超过
int
的范围,要开long long
。
代码:
#include<iostream>
#include<vector>
using namespace std;
int n,k;
int w[100005],deep[100005],vis[100005];
vector<int> tr[100005];
void dfs(int id,int fa,int dep){
if(vis[id]==1) return;
vis[id]=1;
deep[id]=dep;
for(int i=0;i<tr[id].size();i++){
if(tr[id][i]!=fa) dfs(tr[id][i],id,dep+1);
}
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
tr[u].push_back(v);
tr[v].push_back(u);
}
dfs(1,0,0);
long long ans=0;
for(int i=1;i<=n;i++){
if(deep[i]<=2*k) ans+=w[i];
}
cout<<ans;
return 0;
}