(1)贪心想肯定让偶数层的权值a置为0,这样我们可以计算出偶数层的s值为他的父亲结点s值
(2)为了方便计算,进一步想,让偶数层代替他的最小的儿子结点的贡献,即让si等于儿子结点中最小的si(为了保证合法),这样做相当于对该儿子结点ai值置零,父亲结点代替该ai
(3)由(2) ,我们将所有s值上调之后直接做差计算每个结点的贡献即可
int s[MX],f[MX];
inline int solve()
{
int n;cin>>n;
for(int i=2;i<=n;++i) cin>>f[i];
rpp(i,n) cin>>s[i];
rpp(i,n) if(s[i]==-1) s[i]=1e9+1;
for(int i=2;i<=n;++i) s[f[i]]=min(s[f[i]],s[i]);
ll ans=0;
rpp(i,n)
{
if(s[i]<s[f[i]]) return 0;
if(s[i]<=1e9) ans+=s[i]-s[f[i]];//防止加进去叶子结点是偶数层的情况
}
cout<<ans<<endl;
return 1;
}
signed main()
{
int T=1;
// cin>>T;
while(T--)
{
if(!solve()) cout<<"-1\n";
}
stop;
return 0;
}