Cod sursa(job #1501053)

Utilizator GinguIonutGinguIonut GinguIonut Data 12 octombrie 2015 22:57:12
Problema Cerere Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include <fstream>
#include <vector>
#define nMax 100002
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int Lev[nMax], K[nMax], a, b, Sol[nMax], i, n, root;
vector <int> G[nMax];
bool Deg[nMax];
void DFS(int node, int lvl)
{
    if(K[node]==0)
        Lev[lvl]=0;
    else
        Lev[lvl]=Lev[lvl-K[node]]+1;
    Sol[node]=Lev[lvl];
    for(vector<int>::iterator it=G[node].begin();it!=G[node].end();it++)
        DFS(*it, lvl+1);
}
int main()
{
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>K[i];
    for(i=1;i<n;i++)
    {
        fin>>a>>b;
        G[a].push_back(b);
        Deg[b]=1;
    }
    for(i=1;i<=n;i++)
    {
        if(Deg[i]==0)
        {
            root=i;
            break;
        }
    }
    DFS(root, 1);
    for(i=1;i<=n;i++)
        fout<<Sol[i]<<" ";
    return 0;
}