Pagini recente » Cod sursa (job #988445) | Cod sursa (job #493837) | Cod sursa (job #328768) | Cod sursa (job #164774) | Cod sursa (job #1996689)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream fin ("dosare.in"); ofstream fout ("dosare.out");
const int nmax = 16e3;
long long d[nmax + 1];
vector< int > ord;
vector< int > g[nmax + 1];
void dfs (int nod) {
ord.push_back( nod );
for (auto i : g[ nod ]) {
dfs( i );
}
}
inline bool cmp (int x, int y) {
return d[ x ] > d[ y ];
}
int main() {
int n;
fin >> n;
for (int i = 2; i <= n; ++ i) {
int x;
fin >> x;
g[ x ].push_back( i );
}
for (int i = 1; i <= n; ++ i) {
fin >> d[ i ];
}
dfs( 1 );
for (int j = (int)ord.size() - 1; j >= 0; -- j) {
int x = ord[ j ];
for (auto i : g[ x ]) {
d[ x ] += d[ i ];
}
sort(g[ x ].begin(), g[ x ].end(), cmp);
}
long long ans = d[ 1 ];
for (auto j : ord) {
for (int i = 0; i < (int)g[ j ].size(); ++ i) {
ans += d[ g[ j ][ i ] ] * (i + 1);
}
}
fout << ans << "\n";
fin.close();
fout.close();
return 0;
}