Pagini recente » Cod sursa (job #1037156) | Cod sursa (job #142850) | Cod sursa (job #2853923) | Cod sursa (job #3135545) | Cod sursa (job #308319)
Cod sursa(job #308319)
#include <cstdio>
#include <vector>
#include <algorithm>
#include <stdlib.h>
using namespace std;
#define file_in "dosare.in"
#define file_out "dosare.out"
#define sz size
#define pb push_back
#define Nmax 16100
int *v[Nmax];
int a[Nmax];
int b[Nmax];
int n;
inline int cmp(int a,int b)
{
return v[a]>v[b];
}
void dfs1(int nod)
{
int i;
for (i=1;i<=v[nod][0];++i)
{
dfs1(v[nod][i]);
a[nod]+=a[v[nod][i]];
}
}
void dfs2(int nod1, int nod2)
{
int i;
a[nod1]=nod2;
for (i=1;i<=v[nod1][0];++i)
{
dfs2(v[nod1][i],nod2+i);
}
}
void citire()
{
int i,x,y;
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d", &n);
for (i=1;i<=n;++i)
{
v[i]=(int *) realloc(v[i],sizeof(int));
v[i][0]=0;
}
for (i=2;i<=n;++i)
{
scanf("%d", &x);
v[x][0]++;
v[x]=(int *) realloc(v[x], (v[x][0]+1)*(sizeof(int)));
v[x][v[x][0]]=i;
}
for (i=1;i<=n;++i)
{
scanf("%d", &y);
a[i]=y;
b[i]=y;
}
}
void solve()
{
int i;
dfs1(1);
for (i=1;i<=n;++i)
sort(v[i]+1,v[i]+v[i][0]+1,cmp);
dfs2(1,1);
}
void scrie()
{
int i,sum=0;
for (i=1;i<=n;++i)
// printf("%d ",a[i]);
sum+=b[i]*a[i];
printf("%d", sum);
}
int main()
{
citire();
solve();
scrie();
fclose(stdin);
fclose(stdout);
return 0;
}