Cod sursa(job #197120)

Utilizator AndreyPAndrei Poenaru AndreyP Data 1 iulie 2008 16:51:27
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<stdio.h>
#define N 100005
int n,k[N],co[N],st[N],nr,strm[N],sol[N];
bool viz[N],cafiu[N];
struct graf
{
	int nod;
	graf *next;
};
graf *a[N];
void adauga(int tata,int fiu)
{
	graf *g=new graf;
	g->nod=fiu;
	g->next=a[tata];
	a[tata]=g;
}
void citeste()
{
	int i,tata,fiu;
	scanf("%d",&n);
	for(i=1; i<=n; i++)
		scanf("%d",&k[i]);
	for(i=1; i<n; i++)
	{
		scanf("%d%d",&tata,&fiu);
		adauga(tata,fiu);
		cafiu[fiu]=true;
	}
}
void dfs(int x)
{
	viz[x]=true;
	st[++nr]=x;
	strm[x]=st[nr-k[x]];
	graf *g;
	g=a[x];
	while(g)
	{
		if(!viz[g->nod])
			dfs(g->nod);
		g=g->next;
	}
	nr--;
}
void bfs(int x)
{
	int inc=0,sf=0,acu;
	co[0]=x;
	viz[x]=false;
	graf *g;
	while(inc<=sf)
	{
		acu=co[inc++];
		g=a[acu];
		while(g)
		{
			if(viz[g->nod])
			{
				co[++sf]=g->nod;
				viz[g->nod]=false;
			}
			g=g->next;
		}
	}
}
void rezolva()
{
	int i,parinte=0;
	for(i=1; (i<=n)&&(parinte==0); i++)
	{
		if(cafiu[i]==false)
			parinte=i;
	}
	dfs(parinte);
	bfs(parinte);
	for(i=0; i<n; i++)
	{
		if(k[co[i]]==0)
			sol[co[i]]=0;
		else
			sol[co[i]]=sol[strm[co[i]]]+1;
	}
}
void scrie()
{
	int i;
	for(i=1; i<n; i++)
		printf("%d ",sol[i]);
	printf("%d\n",sol[n]);
}
int main()
{
	freopen("cerere.in","r",stdin);
	freopen("cerere.out","w",stdout);
	citeste();
	rezolva();
	scrie();
	return 0;
}