注意:要用long long
2026-03-14 10:23:27
发布于:广东
13阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
//注意:要用long long
long long n,a[200010];
vector<long long> v[200010];
long long dp[200010];
void dfs(long long x){
dp[x]=a[x];
//如果是叶子结点就结束
if(v[x].size()==0){
return ;
}
long long sum=0;
//遍历与结点x链接的所有结点
for(auto i:v[x]){
dfs(i);
sum+=dp[i];
}
dp[x]=min(a[x],sum);
}
int main(){
cin>>n;
//输入,创建一个"图"
for(long long i=2;i<=n;i++){
long long x;
cin>>x;
v[x].push_back(i);
}
//输入染黑代价
for(long long i=1;i<=n;i++){
cin>>a[i];
}
//进行深搜
dfs(1);
//输出答案
cout<<dp[1];
}
这里空空如也








有帮助,赞一个