Cod sursa(job #982669)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 9 august 2013 17:39:41
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include<stdio.h>
#include<string.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], Ans[NMAX];

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

int main(){
    int 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]);
    for(int i = 1; i < n; ++ i){
        scanf("%d %d", &x, &y);
        v[x].push_back(y);
        viz[y] = 1;
    }
    for(int i = 1; i <= n; ++ i)
        if(! viz[i]){
            memset(viz, 0, sizeof(viz));
            dfs(i);
            break;
        }
    for(int i = 1; i <= n; ++ i)
        printf("%d ", Ans[i]);
    return 0;
}