Cod sursa(job #677781)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 10 februarie 2012 17:42:30
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <stack>
#include <vector>
using namespace std;

#define NMAX 100002

const char infile[] = "cerere.in";
const char outfile[] = "cerere.out";

bool isChild[NMAX];
int K[NMAX];
int Solutie[NMAX];
vector<int> Fii[NMAX];

vector<int> ancestors;


void DFS(int root)
{
	ancestors.push_back(root);

	int count = 0;
	int currentK = K[root];
	int index = ancestors.size() - 1;

	while(currentK != 0)
	{
		int aux = currentK;
		currentK = K[ancestors[index - currentK]];
		index = index - aux;
		count ++;
	}

	Solutie[root] = count;

	for(vector<int>::iterator itr = Fii[root].begin();
		itr != Fii[root].end();
		itr++)
	{
		DFS(*itr);
	}

	ancestors.pop_back();
}

int main()
{
	fstream fin(infile, ios::in);
	
	int N;
	fin >> N;

	for(int i = 1 ; i <= N; ++i)
	{
		fin >> K[i];
	}

	for(int i = 0 ; i < N -1; ++i)
	{
		int A, B;

		fin >> A >> B;

		Fii[A].push_back(B);
		isChild[B] = true;
	}
	fin.close();


	int root;
	for(int i = 1 ; i <= N; i++)
	{
		if(!isChild[i])
		{
			root = i;
			break;
		}
	}

	DFS(root);

	fstream fout(outfile, ios::out);
	for(int i = 1 ; i <= N; i++)
	{
		fout << Solutie[i] << " ";
	}
	fout << "\n";
	fout .close();

}