Pagini recente » Cod sursa (job #2775233) | Cod sursa (job #1333609) | Cod sursa (job #808344) | Cod sursa (job #944906) | Cod sursa (job #117868)
Cod sursa(job #117868)
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
#define MAX_N 16005
#define FIN "dosare.in"
#define FOUT "dosare.out"
#define pb push_back
int N, A[MAX_N];
vector<int> G[MAX_N], V;
int DFS(int n)
{
int ret = A[n], t = G[n].size();
vector<int>::iterator it;
fprintf(stderr, "%d %d\n", n, A[n]);
for (it = G[n].begin(); it != G[n].end(); ++it)
{
ret += DFS(*it);
A[n] += A[*it];
}
V.clear();
for (it = G[n].begin(); it != G[n].end(); ++it)
V.pb(A[*it]);
sort(V.begin(), V.end());
for (it = V.begin(); it != V.end(); ++it)
ret += (t--)*(*it);
return ret;
}
int main(void)
{
int i, up;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d", &N);
for (i = 1; i < N; ++i)
{
scanf("%d", &up);
G[--up].pb(i);
}
for (i = 0; i < N; ++i)
scanf("%d", A+i);
printf("%d\n", DFS(0));
return 0;
}