贪心的思维,从上往下遍历,对于奇数层的节点u,由于u到根节点的权值是固定的,那么可以计算得到该节点的权值,而对于偶数层的节点u,他的权值等于子节点的s[i]减去从根节点到节点u的权值,那么当取s[i]最小的子节点时,该节点的权值就是最小的
特殊情况:当叶子节点为偶数层时,其权值为0
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
const int N=1e5+5;
int p[N];ll s[N];
int n;
int h[N],e[N<<1],ne[N<<1],idx;
ll a[N];
bool hg[N];//true奇数层
void add(int a,int b){
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
void bfs(){
queue<int> q;
q.push(1);
while(!q.empty()){
int u=q.front();q.pop();
ll minn=1e18;
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
q.push(j);
minn=min(minn,s[j]);
}
if(!hg[u]) s[u]=minn;
if(!hg[u]&&h[u]==-1)s[u]=0;
}
}
void dfs(int u,int sum){
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(!hg[j]) a[j]=max(0ll,s[j]-sum);
else a[j]=s[j]-sum;
dfs(j,sum+a[j]);
}
}
int main(){
cin>>n;
memset(h,-1,sizeof h);
for(int i=2;i<=n;i++) cin>>p[i],add(p[i],i);
for(int i=1;i<=n;i++){
cin>>s[i];
hg[i]=(s[i]==-1?false:true);
}
bfs();
a[1]=s[1];
dfs(1,a[1]);
ll res=0;
for(int i=1;i<=n;i++){
res+=a[i];
if(a[i]<0){
cout<<-1;
return 0;
}
}
cout<<res;
}