Cod sursa(job #622166)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 17 octombrie 2011 16:18:28
Problema Cerere Scor 70
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], r, d[M];

vector < long > V[M];

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

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];
	}
	
	for (i = 1; i <= n; ++i) {
		if (ma[i] == 0 && ma[i] == d[i]) {
			r = i;
			break;
		}
	}
	
	df(r);
	
	for (i = 1; i <= n; ++i) {
		printf("%ld ", f[i]);
	}
	return 0;
}