Cod sursa(job #1477662)

Utilizator CollermanAndrei Amariei Collerman Data 26 august 2015 17:40:33
Problema Dosare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
ifstream fin("dosare.in");
ofstream fout("dosare.out");

const int NMAX = 16005;

int n, sol;
int val[NMAX], viz[NMAX];
vector<int> Graf[NMAX];
queue<int> Q;

void citire()
{
    fin >> n;

    for(int i=2, x; i<=n; i++) {
        fin >> x;
        Graf[x].push_back(i);
    }

    for(int i=1; i<=n; i++) fin >> val[i];
}

void bfs()
{
    for(int i=1; i<=n; i++) viz[i] = 0;
    viz[1] = 1;
    Q.push(1);

    while(!Q.empty()) {
        int top = Q.front(), nr = -1;
        Q.pop();

        for(auto x : Graf[top]) {
            if(!viz[x]) {
                nr++;
                Q.push(x);
                viz[x] = viz[top] + 1 + nr;
            }
        }
    }
}

bool comp(int x, int y) { return viz[x] > viz[y]; }

void sortare(int nod)
{
    for(auto x : Graf[nod])
        if(!viz[x]) {
            sortare(x);
            viz[nod] = viz[x] + 1;
        }

    sort(Graf[nod].begin(), Graf[nod].end(), comp);
}

int main()
{
    citire();
    sortare(1);
    bfs();

    for(int i=1; i<=n; i++)
         sol += val[i] * viz[i];
    fout << sol << '\n';
    return 0;
}