Cod sursa(job #391870)

Utilizator ErgoVicol Sergiu Constantin Ergo Data 6 februarie 2010 13:45:25
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <fstream>
#include <vector>

#define pb push_back
#define NMAX 100100

using namespace std;

int N, Stack, kStr[NMAX], sol[NMAX], treeRoot, St[NMAX], hSt;
bool areTata[NMAX];
vector<int> T[NMAX];

void Citire(void)
{
	ifstream fin("cerere.in");
	
	int i, x, y;
	
	fin >>N;
	for (i = 1; i <= N; i++)
		fin >>kStr[i];
	
	for (i = 1; i < N; i++)
		fin >>x >>y, areTata[y] = 1, T[x].pb(y); 
	
	//Initializare
	for (i = 1; i <= N; i++)
		if (!areTata[i])
			treeRoot = i;
		
	for (i = 1; i <= N; i++)
		sol[i] = -1;
	
	fin.close();
}

void DFS(int i)
{
	int j;
	
	if (kStr[i] != 0)
		sol[i] = sol[St[hSt - kStr[i]]] + 1;
	else
		sol[i] = 0;
	
	for (j = 0; j < T[i].size(); j++)
	{
		hSt++;
		St[hSt] = T[i][j];
		DFS(T[i][j]);
		hSt--;
	}
}

void Rezolva(void)
{
	hSt++;
	St[hSt] = treeRoot;
	sol[treeRoot] = 0;
	
	DFS(treeRoot);
}

void Afisare(void)
{
	ofstream fout("cerere.out");
	
	for (int i = 1; i <= N; i++)
		fout <<sol[i] <<' ';
	
	fout.close();
}

int main()
{
	Citire();
	
	Rezolva();
	
	Afisare();
	
	return 0;
}