Cod sursa(job #863039)

Utilizator SpiriFlaviuBerbecariu Flaviu SpiriFlaviu Data 23 ianuarie 2013 10:42:31
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("cerere.in");
ofstream fout("cerere.out");

vector<int> v[100001];
int n,m,x,y;
int intreaba[100001],sol[100001],t[100001];
bool calculat[100001];
int arbdfs[100001];

void dfs(int nod,int nivel)
{
    arbdfs[nivel] = nod;
    if(intreaba[nod]==0)
        sol[nod] = 1;
    else sol[nod] = 1 + sol[arbdfs[nivel-intreaba[nod]]];
    for(unsigned int i=0;i<v[nod].size();i++)
    {
        dfs(v[nod][i],nivel+1);
    }


}







void calculeaza(int maimuta)
{
    if(intreaba[maimuta]==0)
        sol[maimuta] = 0;
    else
    {
        int tata = maimuta;
        for(int i=1;i<=intreaba[maimuta];i++)
            tata = t[tata];

            if(!calculat[tata])
                calculeaza(tata);
            sol[maimuta] = 1 + sol[tata];

    }
    calculat[maimuta] = true;

}

int main()
{
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        fin>>intreaba[i];
    }
    for(int i=1;i<n;i++)
    {
        fin>>x>>y;
        t[y] = x;
        v[x].push_back(y);
    }

    //getting root
    int root = 1;
    while(t[root]!=0)
        root = t[root];
    dfs(root,1);


    for(int i=1;i<=n;i++)
    {

        fout<<sol[i]-1<<' ';
    }



    fin.close();
    fout.close();

    return 0;
}