Pagini recente » Cod sursa (job #1496259) | Cod sursa (job #2326912) | Cod sursa (job #1108414) | Cod sursa (job #2224293) | Cod sursa (job #2111694)
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream fin("dosare.in");
ofstream fout("dosare.out");
long long A[16005], D[16005];
int N;
vector<int> v[16005];
inline int cmp( int a, int b ){
return A[a] > A[b];
}
void dfs( int nod ){
for( int i = 0; i < v[nod].size(); i++ ){
int vecin = v[nod][i];
dfs( vecin );
A[nod] += A[vecin];
}
D[nod] = A[nod];
if( !v[nod].empty() ){
sort( v[nod].begin(), v[nod].end(), cmp );
for( int i = 0; i < v[nod].size(); i++ ){
int vecin = v[nod][i];;
D[nod] += i * A[vecin] + D[vecin];
}
}
return;
}
int main(){
fin >> N;
for( int i = 2; i <= N; i++ ){
int x; fin >> x;
v[x].push_back( i );
}
for( int i = 1; i <= N; i++ )
fin >> A[i];
dfs( 1 );
fout << D[1] << "\n";
return 0;
}