Cod sursa(job #481372)

Utilizator ooctavTuchila Octavian ooctav Data 31 august 2010 14:54:12
Problema Cerere Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

const int NMAX = 100005;

int N;
int k[NMAX];
int pasi[NMAX];
int tata[NMAX];
vector<int> fii[NMAX];
int coada[NMAX];
int rad;
int viz[NMAX];

void citire()
{
	int x, y;
	cin >> N;
	for(int i = 1 ; i <= N ; i++)
		cin >> k[i];
	for(int i = 1 ; i < N ; i++)
	{
		cin	>> x >> y;
		tata[y] = x;
		fii[x].push_back(y);
	}		
}

void aflare_radacina()
{
	for(int i = 1 ; i <= N ; i++)
		if(!tata[i])
		{
			rad = i;
			return;
		}
}

void DFS(int nod, int nr)
{
	coada[++nr] = nod;
	if(!k[nod])
		pasi[nod] = 0;
	else
		pasi[nod] = pasi[coada[nr - k[nod]]] + 1;
	for(vector<int>:: iterator it = fii[nod].begin() ; it != fii[nod].end() ; it++)
		if(!viz[*it])
			DFS(*it, nr);
	nr--;
}

void scrie()
{
	for(int i = 1 ; i <= N ; i++)
		printf("%d ", pasi[i]);
	printf("\n");
}

int main()
{
	freopen("cerere.in", "r", stdin);
	freopen("cerere.out", "w", stdout);
	citire();
	aflare_radacina();
	DFS(rad, 0);
	scrie();
	return 0;
}