Cod sursa(job #2090603)

Utilizator andreiutu111Noroc Andrei Mihail andreiutu111 Data 18 decembrie 2017 15:32:13
Problema Dosare Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#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;
}