Cod sursa(job #1073075)

Utilizator IoannaPandele Ioana Ioanna Data 5 ianuarie 2014 17:14:30
Problema Cerere Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.19 kb
#include <fstream>
#include <vector>
#include <cstring>
#define NMAX 100002

using namespace std;

vector<int> tree[NMAX];
vector<int> k;
vector<int> lant;

int g[NMAX];
int rad, n;

ifstream in("cerere.in");
ofstream out("cerere.out");

void read() {
    in>>n;
    char root[n + 1];

    memset(root,0, sizeof(root));

    k.push_back(0);

    for (int i = 0; i < n; i++) {
        int a;
        in>>a;
        k.push_back(a);
    }
    for (int i = 0; i < n-1; i++) {
        int a, b;
        in>>a>>b;
        tree[a].push_back(b);
        root[b] = 1;
    }
    for (int i = 1; i <= n; i++) {
        if (!root[i]) {
            rad = i;
            return;
        }
    }
}

void dfs(int nod) {
    if (k[nod] == 0) {
        g[nod] = 0;
    } else {
        g[nod] = g[lant[lant.size() - k[nod] - 1]] + 1;
    }
    for (int i = 0; i < tree[nod].size(); i++) {
        lant.push_back(tree[nod][i]);
        dfs(tree[nod][i]);
        lant.pop_back();
    }
}

void print() {
    for (int i = 1; i <= n; i++) {
        out<<g[i]<<" ";
    }
}

int main() {
    read();
    lant.push_back(rad);
    dfs(rad);
    print();
    return 0;
}