Cod sursa(job #2113855)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 25 ianuarie 2018 10:18:45
Problema Dosare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream in ("dosare.in");
ofstream out ("dosare.out");
long long dis[16001],cate[16001],c[16001],n,x,sol;
vector<int>v[16001];
bool cmp (int a, int b) {
    return cate[a] > cate[b];
}
void dfs1 (int nod) {
    int vecin;
    for (int i = 0; i < v[nod].size(); i ++) {
        vecin = v[nod][i];
        dfs1 (vecin);
        cate[nod] += cate[vecin];
    }
    sort (v[nod].begin(),v[nod].end(),cmp);
    cate[nod] += c[nod];
    return;
}
void dfs2 (int nod) {
    int vecin;
    for (int i = 0; i < v[nod].size(); i ++) {
        vecin = v[nod][i];
        dis[vecin] = dis[nod] + i + 1;
        dfs2 (vecin);
    }
    return;
}
int main (void) {
    in >> n;
    for (int i = 2; i <= n; i ++) {
        in >> x;
        v[x].push_back (i);
    }
    for (int i = 1; i <= n; i ++) {
        in >> c[i];
    }
    dfs1 (1);
    dis[1] = 1;
    dfs2 (1);
    for (int i = 1; i <= n; i ++) {
        sol += dis[i] * c[i];
    }
    out << sol;
    return 0;
}