Cod sursa(job #982652)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 9 august 2013 17:21:50
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include<stdio.h>
#include<vector>
#include<queue>

#define NMAX 100007

using namespace std;

int nr, n;
queue  < int > q;
vector < int > v[NMAX];
int viz[NMAX], a[NMAX], Stack[NMAX], sol[NMAX];

void dfs(int u)
{
    Stack[++ Stack[0]] = u;
    viz[u] = 1;
    if(a[u])
        sol[u] = sol[Stack[Stack[0] - a[u]]] + 1;
    for(vector<int> :: iterator i = v[u].begin(); i != v[u].end(); ++ i)
        if(viz[*i] == 0)
            dfs(*i);
    -- Stack[0];
}

int main(){
    int u = 0, x = 0, y = 0;
    freopen("cerere.in", "r", stdin);
    freopen("cerere.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n; ++ i){
        scanf("%d", &a[i]);
        if(a[i] == 0 && u == 0)
            u = i;
    }
    for(int i = 1; i < n; ++ i){
        scanf("%d %d", &x, &y);
        v[x].push_back(y);
        viz[y] = 0;
    }
    for(int i = 1; i <= n; ++ i)
        if(! viz[i]){
            dfs(i);
            break;
        }
    for(int i = 1; i <= n; ++ i)
        printf("%d ", sol[i]);
    return 0;
}