Cod sursa(job #959833)

Utilizator dunhillLotus Plant dunhill Data 8 iunie 2013 22:49:52
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <cstdio>
#include <vector>
#define MAXN 100003
using namespace std;
 
int i, N, M, j, A, B, head, x;
int K[MAXN], st[MAXN], sol[MAXN];
vector <int> v[MAXN];
bool used[MAXN], t[MAXN];
 
void DFS(int nod) {
	vector <int> :: iterator it, fin;
    used[nod] = true;
    st[++head] = nod;
    if (K[nod])
        sol[nod] = sol[st[head - K[nod]]] + 1;
    it = v[nod].begin(); fin = v[nod].end();
    for (; it != fin; ++it) {
        if (!used[*it]) {
            DFS(*it);
        }
    }
    --head;
}
int main() {
    freopen("cerere.in","r",stdin);
    freopen("cerere.out","w",stdout);
    scanf("%d", &N); M = N - 1;
    for (i = 1; i <= N; ++i) scanf("%d", &K[i]);
    while (M--) {
        scanf("%d%d", &A, &B);
        v[A].push_back(B);
        t[B] = true;
    }
    for (i = 1; i <= N; ++i)
        if (!t[i]) break;
    DFS(i);
    for (i = 1; i <= N; ++i)
        printf("%d ", sol[i]);
    return 0;
}