Cod sursa(job #632092)

Utilizator deneoAdrian Craciun deneo Data 10 noiembrie 2011 12:03:11
Problema Cerere Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.8 kb

#include <stdio.h>
#include <math.h>
#include <vector>

#define M 100010

using namespace std;

long n, a, b, i, S[M], ma[M], f[M], d[M], s;

vector < long > V[M];

void df(long nod) {

	S[s] = nod;
	if (ma[nod] == 0) f[nod] = 0;
	else f[nod] = f[S[s - ma[nod]]] + 1;
	for (long i = 0; i < V[nod].size(); ++i) {
		++s;
		df(V[nod][i]);
		--s;
	}
}

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

	scanf("%ld", &n);
	for (i = 1; i <= n; ++i) scanf("%ld", &ma[i]);
	for (i = 1; i < n; ++i) {
		scanf("%ld %ld", &a, &b);
		V[a].push_back(b);
		++d[b];
	}

	long r = 1;
	for (i = 1; i <= n; ++i) {
		if (ma[i] == 0 && d[i] == 0) {
			r = i;
			break;
		}
	}

	df(r);

	for (i = 1; i <= n; ++i) {
		printf("%ld ", f[i]);
	}
	return 0;
}