Cod sursa(job #830603)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 7 decembrie 2012 10:05:19
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.77 kb
#include<fstream>
#include<vector>
#define DIM 100010

using namespace std;


int n , i , K[DIM],a,b;


ifstream f("cerere.in");
ofstream g("cerere.out");

vector<int>L[DIM];
int stack[DIM];
int k;
int Str[DIM],Sol[DIM];
void dfs(int x,int ant){
	stack[++k]=ant;
	if(K[x]==0)
		Str[x]=0;
	else
		Str[x]=stack[k-K[x]+1];
	for(unsigned int i=0;i<L[x].size();i++){
		dfs(L[x][i],x);
		k--;
	}
}

int find_sol(int nod){
	if(Str[nod]==0)
		return 1;
	if(Sol[nod]!=0)
		return Sol[nod];
	else
		return (Sol[nod]=1+find_sol(Str[nod]));
}

int main(){
	
	f>>n;
	for(i=1;i<=n;i++)
		f>>K[i];
	
	for(i=1;i<n;i++){
		f>>a>>b;
		L[a].push_back(b);
	}
	
	dfs(1,0);
	
	for(i=1;i<=n;i++){
		Sol[i]=find_sol(i);
		g<<Sol[i]-1<<" ";
	}
	
	return 0;
}