Pagini recente » Cod sursa (job #1024919) | Cod sursa (job #3289431) | Cod sursa (job #147814) | Cod sursa (job #430078) | Cod sursa (job #2485461)
#include <bits/stdc++.h>
#define DIM 16005
using namespace std;
ifstream fin ("dosare.in");
ofstream fout ("dosare.out");
int n, i, a, x, nr;
int viz[DIM];
long long d[DIM], cost[DIM];
//d[i] = nr total de apasari de taste daca i este radacina
vector <int> L[DIM];
int cmp(int a, int b) {
return cost[a] > cost[b];
}
void dfs (int nod){
int vecin, i;
viz[nod] = 1;
for (i=0; i<L[nod].size(); i++){
vecin = L[nod][i];
if (viz[vecin] == 0)
dfs(vecin);
cost[nod] += cost[vecin];
}
d[nod] = cost[nod];
sort (L[nod].begin(), L[nod].end(), cmp);
for (i=0; i<L[nod].size(); i++){
vecin = L[nod][i];
d[nod] += i*cost[vecin] + d[vecin];
}
}
int main(){
fin >> n;
for (i=2; i<=n; i++){
fin >> a;
L[a].push_back(i);
}
for (i=1; i<=n; i++){
fin >> cost[i];
}
dfs(1);
fout << d[1];
return 0;
}