Cod sursa(job #622175)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 17 octombrie 2011 16:26:40
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.81 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;
}