Pagini recente » Cod sursa (job #1581542) | Cod sursa (job #616607) | Cod sursa (job #2723207) | Cod sursa (job #3258612) | Cod sursa (job #2030075)
#include <fstream>
#include <vector>
#include <algorithm>
#define DIM 16002
using namespace std;
ifstream f("dosare.in");
ofstream g("dosare.out");
int n, cost[DIM], t[DIM], cost2[DIM];
vector <int> arb[DIM];
void Cost(int nod)
{
for(int i = 0; i < arb[nod].size(); ++ i)
{
Cost(arb[nod][i]);
}
if(nod != 1)
{
cost[t[nod]] += cost[nod];
}
}
int sol(int nod, int nr)
{
for(int i = 0; i < arb[nod].size(); ++ i)
{
int vall = i;
if(nod == 1)
++ vall;
sol(arb[nod][i], vall + 1);
}
if(nod != 1)
{
int val = cost2[nod] * nr;
//if(cost[nod] > 1) val *= (cost[nod] - 1);
cost2[t[nod]] += val;
}
}
bool cmd(int a, int b)
{
return cost[a] > cost[b];
}
int main()
{
f>>n;
for(int i = 2; i <= n; ++ i)
f>>t[i];
for(int i = 1; i <= n; ++ i)
{
f>>cost[i];
cost2[i] = cost[i];
}
for(int i = 1; i <= n; ++ i)
{
arb[t[i]].push_back(i);
}
Cost(1);
for(int i = 1; i <= n; ++ i)
sort(arb[i].begin(), arb[i].end(), cmd);
/*for(int i = 1; i <= n; ++ i)
{
for(int j = 0; j < arb[i].size(); ++ j)
g<<arb[i][j]<<" ";
g<<'\n';
}*/
sol(1, 1);
g<<cost2[1];
return 0;
}