Pagini recente » Cod sursa (job #1383321) | Cod sursa (job #1755885) | Cod sursa (job #1963080) | Cod sursa (job #335769) | Cod sursa (job #1645442)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
struct fiu
{
int numar;
int cost;
int total;
};
int a;
int cost[16001];
int total;
vector<fiu> fii[16001];
bool cmp(fiu a,fiu b)
{
if (a.cost+a.total>b.cost+b.total){return true;}
return false;
}
void calc(int k,fiu& c)
{
int i;
if (fii[k].empty())
{
c.cost=cost[c.numar];
c.total=1;
}
else
{
for (i=0;i<fii[k].size();i++)
{
calc(fii[k][i].numar,fii[k][i]);
}
sort(fii[k].begin(),fii[k].end(),cmp);
c.cost=cost[k];
for (i=0;i<fii[k].size();i++)
{
c.cost+=fii[k][i].cost;
c.cost+=(i+1)*fii[k][i].total;
}
}
}
void parg(int k,int t)
{
total+=cost[k]*t;
for (int i=0;i<fii[k].size();i++)
{
parg(fii[k][i].numar,t+i+1);
}
}
int main()
{
ifstream in("dosare.in");
ofstream out("dosare.out");
int i,n,x;
fiu acum;
acum.cost=0;
acum.total=0;
in>>n;
for (i=2;i<=n;i++)
{
in>>x;
acum.numar=i;
fii[x].push_back(acum);
}
for (i=1;i<=n;i++)
{
in>>cost[i];
}
calc(1,acum);
parg(1,1);
out<<total;
}