Pagini recente » Cod sursa (job #1821473) | Cod sursa (job #1545325) | Cod sursa (job #2699706) | Cod sursa (job #3267593) | Cod sursa (job #2090603)
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
ifstream f("dosare.in");
ofstream g("dosare.out");
struct fisier{
int val,nr,nrac,ind;
}v[16001];
int N,s;
bool n[16001];
vector <int> G[16001];
bool cmp(fisier X,fisier Y){
if(X.nrac<Y.nrac)return false;
else if(X.nrac==Y.nrac && X.nr<Y.nr)return false;
return true;
}
int nracc(int nod){
for(int i=1;i<=N;++i)
if(v[i].ind==nod)
return v[i].nrac;
}
void dfs(int nod,int nr){
n[nod]=1,++nr,s+=nr*nracc(nod);
for(int i=0;i<G[nod].size();++i)
if(!n[G[nod][i]])
dfs(G[nod][i],nr),++nr;
}
int main()
{
f>>N;
v[1].val=0;
for(int i=2;i<=N;++i)f>>v[i].val,++v[v[i].val].nr;
for(int i=1;i<=N;++i)f>>v[i].nrac,v[i].ind=i;
sort(v+1,v+N+1,cmp);
for(int i=1;i<=N;++i)
if(v[i].ind!=1)
G[v[i].val].push_back(v[i].ind);
dfs(1,0);
g<<s;
return 0;
}