Pagini recente » Cod sursa (job #26453) | Cod sursa (job #1717996) | Cod sursa (job #1249361) | Cod sursa (job #2719041) | Cod sursa (job #119526)
Cod sursa(job #119526)
#include<stdio.h>
#include<algorithm>
#define lg 16005
using namespace std;
int n, a, i, nr[lg], *v[lg], vl[lg], ac[lg], act[lg];
int cmp(int a, int b){
if (a != b)
return (a > b);
return 0;
}
void df(int nod, int str){
int i;
//fprintf(stderr, "%d\n", nod);
if (!nr[nod]){
vl[nod] = ac[nod];
act[nod] = ac[nod];
act[str] += act[nod];
fprintf(stderr, "pentru nodul %d valoarea este %d\n", nod, vl[nod]);
return ;
}
int ind = 0, q[nr[nod]+1];
for (i = 1; i <= nr[nod]; i ++)
df(v[nod][i], nod);
act[nod] += ac[nod];
act[str] += act[nod];
for (i = 1; i <= nr[nod]; i ++)
q[++ind] = act[v[nod][i]];
sort(q+1, q+ind+1, cmp);
for (i = 1; i <= nr[nod]; i ++){
vl[nod] += q[i]*i + vl[v[nod][i]];
//fprintf(stderr, "%d ", i*q[i]);
}
vl[nod] += ac[nod];
fprintf(stderr, "\npentru nodul %d valoarea este %d\n", nod, vl[nod]);
}
int main()
{
freopen("dosare.in", "rt", stdin);
freopen("dosare.out", "wt", stdout);
scanf("%d", &n);
for (i = 1; i < n; i ++){
scanf("%d", &a);
nr[a] ++;
v[a] = (int*)realloc(v[a], (nr[a]+1)*sizeof(int));
v[a][nr[a]] = i+1;
}
for (i = 1; i <= n; i ++)
scanf("%d", &ac[i]);
df(1, 0);
printf("%d\n", vl[1]);
fclose(stdin);
fclose(stdout);
return 0;
}