Cod sursa(job #1609333)

Utilizator cristina_borzaCristina Borza cristina_borza Data 22 februarie 2016 18:55:20
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
#include <vector>
#include <cstdio>
#include <queue>

#define NMAX 100005

using namespace std;

int k[NMAX] , sol[NMAX] , t[NMAX] , stramos[NMAX];
int n , x , y , niv;

vector <vector <int> > v;
queue <int> coada;

void bfs(int nod);

void read(int &x) {
    int sign = 1;
    char ch;

    while(!isdigit(ch = getchar())) {
        if(ch == '-') {
            sign = -1;
        }

        else {
            sign = 1;
        }
    }

    x = 0;
    do {
        x = x * 10 + ch - '0';
    }while(isdigit(ch = getchar()));

    x *= sign;
}

int main() {
    freopen("cerere.in" , "r" , stdin);
    freopen("cerere.out" , "w" , stdout);

    read(n);
    for(int i = 1 ; i <= n ; ++i) {
        read(k[i]);
    }

    v.resize(n + 5);
    for(int i = 1 ; i < n ; ++i) {
        read(x) , read(y);
        v[x].push_back(y);
        t[y] = x;
    }

    int p = 1;
    while(t[p] != 0) {
        p = t[p];
    }

    bfs(p);

    for(int i = 1 ; i <= n ; ++i) {
        printf("%d " , sol[i]);
    }
    return 0;
}

void bfs(int nod) {
    ++niv;
    stramos[niv] = nod;

    if(k[nod] == 0) {
        sol[nod] = 0;
    }

    else {
        sol[nod] = sol[stramos[niv - k[nod]]] + 1;
    }

    int nr = v[nod].size();
    for(int i = 0 ; i < nr ; ++i) {
        bfs(v[nod][i]);
    }

    --niv;
}