Cod sursa(job #959810)

Utilizator dunhillLotus Plant dunhill Data 8 iunie 2013 21:37:06
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <cstdio>
#include <vector>
#define MAXN 100003
using namespace std;

int i, N, M, j, A, B, head, sol, x;
int K[MAXN], ANC[MAXN], st[MAXN];
vector <int> v[MAXN];
bool used[MAXN];

inline void DFS(int nod) {
	used[nod] = true;
	st[++head] = nod;
	if (head - K[nod] >= 1)
		ANC[nod] = st[head - K[nod]];
	vector <int> :: iterator it, fin;
	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("%i", &N); M = N - 1;
	for (i = 1; i <= N; ++i) scanf("%i", &K[i]);
	while (M--) {
		scanf("%i%i", &A, &B);
		v[A].push_back(B);
		v[B].push_back(A);
	}
	DFS(1);
	for (i = 1; i <= N; ++i) {
		x = i; sol = 0;
		while (K[x] != 0) 
			x = ANC[x], ++sol;
		printf("%i ", sol);
	}
	printf("\n");
	return 0;
}