Pagini recente » Cod sursa (job #1863684) | Cod sursa (job #1261102) | Cod sursa (job #1414327) | Cod sursa (job #93557) | Cod sursa (job #2211796)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
struct vct
{
int x;
long long y;
}val[16002]; ///x=parintele; y=de cate ori se trece pe acolo
vector <int> v[16002];
long long n,a,j,nr;
void dfs(int start)
{
int i;
for(i=0;i<v[start].size();i++)
{
dfs(v[start][i]);
}
val[val[start].x].y+=val[start].y;
}
bool cmp (int A , int B)
{
return val[A].y>val[B].y;
}
int main()
{
ifstream f("dosare.in");
ofstream g("dosare.out");
int i;
f>>n;
for(i=2;i<=n;i++)
{
f>>a;
v[a].push_back(i);
val[i].x=a;
}
for(i=1;i<=n;i++)
{
f>>a;
val[i].y=a;
}
dfs(1);
for(i=1;i<=n;i++)
sort(v[i].begin(),v[i].end(),cmp);
for(i=1;i<=n;i++)
for(j=0;j<v[i].size();j++)
nr=nr+val[v[i][j]].y*(j+1);
g<<nr+val[1].y;
return 0;
}