Cod sursa(job #681978)

Utilizator Catah15Catalin Haidau Catah15 Data 18 februarie 2012 13:13:32
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 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], S;


void dfs (int nod)
{
	S.PB (nod);
	
	for (unsigned int i = 0; i < lista[nod].size(); ++ i)
	{
		int nod2 = lista[nod][i];
		
		if (! K[nod2])
		{
			dfs (nod2);
			continue;
		}
		
		sol[nod2] = sol[S[S.size() - K[nod2]]] + 1;
		
		dfs (nod2);
	}
	
	S.pop_back ();
}


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 = 0;
	
	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;
}