Pagini recente » Cod sursa (job #3154797) | Cod sursa (job #699791) | Cod sursa (job #1240257) | Cod sursa (job #785727) | Cod sursa (job #2113855)
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream in ("dosare.in");
ofstream out ("dosare.out");
long long dis[16001],cate[16001],c[16001],n,x,sol;
vector<int>v[16001];
bool cmp (int a, int b) {
return cate[a] > cate[b];
}
void dfs1 (int nod) {
int vecin;
for (int i = 0; i < v[nod].size(); i ++) {
vecin = v[nod][i];
dfs1 (vecin);
cate[nod] += cate[vecin];
}
sort (v[nod].begin(),v[nod].end(),cmp);
cate[nod] += c[nod];
return;
}
void dfs2 (int nod) {
int vecin;
for (int i = 0; i < v[nod].size(); i ++) {
vecin = v[nod][i];
dis[vecin] = dis[nod] + i + 1;
dfs2 (vecin);
}
return;
}
int main (void) {
in >> n;
for (int i = 2; i <= n; i ++) {
in >> x;
v[x].push_back (i);
}
for (int i = 1; i <= n; i ++) {
in >> c[i];
}
dfs1 (1);
dis[1] = 1;
dfs2 (1);
for (int i = 1; i <= n; i ++) {
sol += dis[i] * c[i];
}
out << sol;
return 0;
}