Cod sursa(job #1585965)

Utilizator claudiuarseneClaudiu Arsene claudiuarsene Data 31 ianuarie 2016 17:09:42
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <fstream>
#include <vector>

using namespace std;

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

int n, top, nod, rad, STR[100010], S[100010], NR[100010];
bool DAD[100010];
vector < int > V[100010];

int main()
{
    fin >> n;
    for (int i = 1; i <= n; i ++) fin >> STR[i];
    for (int i = 1, a, b; i < n; i ++)
    {
        fin >> a >> b;
        DAD[b] = true;
        V[a].push_back(b);
    }

    for (int i = 1; i <= n; i ++)
    {
        if (!DAD[i])
        {
            rad = i;
            break;
        }
    }

    S[++top] = rad;
    while (top)
    {
        if (!V[S[top]].empty())
        {
            nod = V[S[top]].back();
            V[S[top]].pop_back();
            S[++top] = nod;
            if (STR[nod]) NR[nod] = NR[S[top - STR[nod]]] + 1;
        }
        else
        {
            top --;
        }
    }

    for (int i = 1; i < n; i ++) fout << NR[i] << ' ';
    fout << NR[n] << '\n';
    fout.close();
    return 0;
}