Cod sursa(job #1207833)

Utilizator vendettaSalajan Razvan vendetta Data 14 iulie 2014 01:51:21
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.83 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

const int NMAX = 100001;

int n, stv[NMAX], ans[NMAX], k[NMAX], t[NMAX];
vector<int> gf[NMAX];

void dfs(int node){
	stv[++stv[0]] = node;
	if (k[node] == 0) ans[node] = 0;
	else ans[node] = ans[ stv[stv[0] - k[node]] ] + 1;
	for(int i=0; i<(int)gf[node].size(); ++i){
		dfs(gf[node][i]);
	}
	--stv[0];
}

int main() {
	//freopen("cerere.in", "r", stdin);
	//freopen("cerere.out", "w", stdout);
	ifstream f("cerere.in");
	ofstream g("cerere.out");
	f >> n;
	for(int i=1; i<=n; ++i) f >> k[i];
	for(int i=1; i<n; ++i){
		int x, y;
		//cin >> x >> y;
		f >> x >> y;
		gf[x].push_back(y);
		t[y] = x;
	}
	int rad = 0;
	for(int i=1; i<=n; ++i) if (t[i] == 0) rad = i;
	dfs(rad);

	for(int i=1; i<=n; ++i){
		//cout << ans[i] << " ";
		g << ans[i] << " ";
	}
	return 0;
}