Cod sursa(job #1256658)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 6 noiembrie 2014 18:52:40
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <stdio.h>
#include <vector>
using namespace std;

#define Nmax 100005

vector < vector<int> > Graph;
int v[Nmax];
int d[Nmax];
int rez[Nmax];
bool father[Nmax];
int di;
int n;

void read(){
    int x, y;

    scanf("%d", &n);
    Graph.resize(n + 1);
    for (int i = 1; i <= n; ++i)
        scanf("%d", &v[i]);
    for (int i = 1; i < n; ++i){
        scanf("%d %d", &x, &y);
        Graph[x].push_back(y);
        father[y] = true;
    }
}

void dfs(int node){
    vector<int>::iterator it;
    for (it = Graph[node].begin(); it != Graph[node].end(); ++it){
        if (v[*it] == 0)
            d[++di] = 0;
        else
            d[++di] = d[ di - v[*it] ] + 1;
        rez[*it] = d[di];
        dfs(*it);
    }
    --di;
}

void solve(){
    int root;

    for (int i = 1; i <= n; ++i)
        if (!father[i]){
            root = i;
            break;
        }
    dfs(root);
    for (int i = 1; i <= n; ++i)
       printf("%d ", rez[i]);
    printf("\n");
}

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

    read();
    solve();
}