Cod sursa(job #681966)

Utilizator Catah15Catalin Haidau Catah15 Data 18 februarie 2012 12:43:48
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

#define maxN 100005
#define PB push_back


int sol[maxN], tata[maxN], K[maxN];
vector <int> lista[maxN];


void solve (int nod)
{
	int k = K[nod];
	int nod2 = nod;
	
	if (! k) return;
	
	while (k)
	{
		nod2 = tata[nod2];
		-- k;
	}
	
	sol[nod] = sol[nod2] + 1;
}


void dfs (int nod)
{
	for (unsigned int i = 0; i < lista[nod].size(); ++ i)
	{
		solve (lista[nod][i]);
		dfs (lista[nod][i]);
	}
}


int main()
{
	ifstream f ("cerere.in");
	ofstream g ("cerere.out");
	
	int N;
	
	f >> N;
	
	for (int i = 1; i <= N; ++ i) f >> K[i];
	
	for (int i = 1, a, b; i < N; ++ i)
	{
		f >> a >> b;
		
		tata[b] = a;
		lista[a].PB (b);
	}
	
	int nods;
	
	for (int i = 1; i <= N; ++ i)
		if (! tata[i])
		{
			nods = i;
			break;
		}
	
	dfs (nods);
	
	for (int i = 1; i <= N; ++ i) g << sol[i] << " ";
	
	return 0;
}