Pagini recente » Cod sursa (job #3321393) | Cod sursa (job #3331772) | Cod sursa (job #3320426) | Cod sursa (job #3329222) | Cod sursa (job #3313805)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("dosare.in");
ofstream fout("dosare.out");
const int NMAX = 16005;
struct Nod {
vector <int> copii;
int dp;
}v[NMAX];
int n, ans = 0;
int accesari[NMAX];
void dfs(int node, int depth) {
for (auto it : v[node].copii) {
dfs(it, depth + 1);
v[node].dp += v[it].dp;
}
v[node].dp += accesari[node];
ans += accesari[node] * depth;
sort(v[node].copii.begin(), v[node].copii.end(), [](int a, int b) {
return v[a].dp > v[b].dp;
});
for (int i = 0; i < v[node].copii.size(); i++) {
int x = v[node].copii[i];
ans += v[x].dp * i;
}
}
int main()
{
fin >> n;
for (int i = 2; i <= n; i++) {
int parinte;
fin >> parinte;
v[parinte].copii.push_back(i);
}
for (int i = 1; i <= n; i++) {
fin >> accesari[i];
}
dfs(1, 1);
fout << ans;
return 0;
}