Pagini recente » Cod sursa (job #2519436) | Cod sursa (job #1127861) | Cod sursa (job #1047654) | Cod sursa (job #2520573) | Cod sursa (job #2089004)
#include <bits/stdc++.h>
using namespace std;
int n,m,cost[16006],ap[16006],x,y,i,rez;
vector <int> G[16006];
int a[16005];
bool cmp(int x,int y)
{
return a[x]>a[y];
}
int doit(int n)
{
if(G[n].size()==0)
{
return a[n];
}
else
{
int s=a[n];
for(int i=0;i<G[n].size();i++)
s=s+doit(G[n][i]);
a[n]=s;
return s;
}
}
void doCost(int n)
{
for(int i=0;i<G[n].size();i++)
{
cost[G[n][i]]=cost[n]+i+1;
doCost(G[n][i]);
}
}
int main()
{
freopen("dosare.in","r",stdin);
freopen("dosare.out","w",stdout);
scanf("%d",&n);
for(int i=2;i<=n;i++)
{
scanf("%d",&x);
G[x].push_back(i);
}
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
ap[i]=a[i];
}
doit(1);
for(int i=1;i<=n;i++)
if(G[i].size()!=0)
sort(G[i].begin(),G[i].end(),cmp);
cost[1]=1;
doCost(1);
for(int i=1;i<=n;i++)
rez+=ap[i]*cost[i];
printf("%d\n",rez);
return 0;
}