Cod sursa(job #770352)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 22 iulie 2012 19:06:58
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <cstdio>
#include <fstream>
#include <vector>

using namespace std;


const int N = 100005;

int n, x, y, top, radacina;
int k[N], sol[N], stack[N], viz[N], tata[N];
vector <int> fiu[N];

void df(int nod)
{
    //if(viz[nod])
        //return;
    stack[++top] = nod;
    if(k[nod] != 0)
        sol[nod] = sol[stack[top - k[nod]]] + 1;
    else sol[nod] = 0;
    //fprintf(stderr, "%d %d %d %d\n", nod, sol[nod], top, k[nod]);
    //stack[++top] = nod;
    for(int i = 0; i < fiu[nod].size(); ++i)
        df(fiu[nod][i]);
    --top; 
}

int main()
{
    //freopen ("cerere.in", "r", stdin);
    //freopen ("cerere.out", "w", stdout);
    ifstream f("cerere.in");
    ofstream g("cerere.out");
    f >> n;
    for(int i = 1; i <= n; ++i)
        f >> k[i];
    for(int i = 1; i < n; ++i) {
        f >> x >> y;
        fiu[x].push_back(y);
        tata[y] = x;
    }

    for(int i = 1; i <= n; ++i)
        if(tata[i] == 0) {
            radacina = i;
            break;
        }
    df(radacina);
    for(int i = 1; i <= n; ++i)
        g << sol[i] << ' ';
}