Pagini recente » Cod sursa (job #2924487) | Cod sursa (job #570523) | Cod sursa (job #2718498) | Cod sursa (job #602665) | Cod sursa (job #1477662)
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
ifstream fin("dosare.in");
ofstream fout("dosare.out");
const int NMAX = 16005;
int n, sol;
int val[NMAX], viz[NMAX];
vector<int> Graf[NMAX];
queue<int> Q;
void citire()
{
fin >> n;
for(int i=2, x; i<=n; i++) {
fin >> x;
Graf[x].push_back(i);
}
for(int i=1; i<=n; i++) fin >> val[i];
}
void bfs()
{
for(int i=1; i<=n; i++) viz[i] = 0;
viz[1] = 1;
Q.push(1);
while(!Q.empty()) {
int top = Q.front(), nr = -1;
Q.pop();
for(auto x : Graf[top]) {
if(!viz[x]) {
nr++;
Q.push(x);
viz[x] = viz[top] + 1 + nr;
}
}
}
}
bool comp(int x, int y) { return viz[x] > viz[y]; }
void sortare(int nod)
{
for(auto x : Graf[nod])
if(!viz[x]) {
sortare(x);
viz[nod] = viz[x] + 1;
}
sort(Graf[nod].begin(), Graf[nod].end(), comp);
}
int main()
{
citire();
sortare(1);
bfs();
for(int i=1; i<=n; i++)
sol += val[i] * viz[i];
fout << sol << '\n';
return 0;
}