Cod sursa(job #414373)

Utilizator bora_marianBora marian bora_marian Data 9 martie 2010 23:34:50
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include<fstream>
using namespace std;
int t[100005],nivel[100005],solutia[100005],v[100005],n;
struct nod{
    int info;
    nod *next;};
nod *g[100005];
void adauga(int a,int b);
void dfs(int k,int niv);
	int main()
{
	ifstream fin("cerere.in");
	freopen("cerere.out","w",stdout);
	fin>>n;
	int i;
	for(i=1;i<=n;i++)
		fin>>v[i];
	for(i=1;i<n;i++)
	{
		int a,b;
		fin>>a>>b;
		adauga(a,b);
		t[b]=a;
	}
	int radacina,pp=0;
	for(i=1;i<=n && pp==0;i++)
		if(t[i]==0)
			radacina=i,pp=1;
	dfs(radacina,0);
	//for(i=1;i<=n;i++)
		//printf("%d ",solutia[i]);
	for(i=1;i<=n;i++)
	{
		int nr=0;
		int y=i;
		while(solutia[y])
			nr++,y=solutia[y];
		printf("%d ",nr);
	}
	return 0;
}
void dfs(int k,int niv)
{
	niv++;
	nivel[niv]=k;
	if(v[k]!=0)
		solutia[k]=nivel[niv-v[k]];
	for(nod*p=g[k];p;p=p->next)
		dfs(p->info,niv);
}
void adauga(int a,int b)
{
	nod *p;
	p=new nod;
	p->info=b;
	p->next=g[a];
	g[a]=p;
}