Cod sursa(job #80122)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 26 august 2007 11:18:31
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<stdio.h>
struct nod{
long int fiu;
nod *next;
};
long int n,i,str[100002],rez[100002],dad,son,rad[100002],stv[100002],ccc,u,sol[100002];
nod *prim[100002],*ultim[100002];
void punefiu(long int dd,long int ss);
int main()
{
	FILE *f,*g;f=fopen("cerere.in","r");g=fopen("cerere.out","w");
	fscanf(f,"%ld",&n);for(i=1;i<=n;i++){fscanf(f,"%ld",&str[i]);if(!str[i]) rez[i]=1;}
	for(i=1;i<n;i++){fscanf(f,"%ld%ld",&dad,&son);rad[son]=1;punefiu(dad,son);}
	for(i=1;i<=n;i++)if(!rad[i]){ stv[1]=i;break;};u=1;
	while(u>=1)
	{
	  ccc=stv[u];
	  if(!rez[ccc]){sol[ccc]=sol[stv[u-str[ccc]]]+1;rez[ccc]=1;}
	  if(prim[ccc])
	   { u++;stv[u]=prim[ccc]->fiu;prim[ccc]=prim[ccc]->next;}
	  else
	   { stv[u]=0;u--;}
	}
	for(i=1;i<=n;i++)
	 fprintf(g,"%ld ",sol[i]);
	fprintf(g,"\n");
	fcloseall();
	return 0;
}
void punefiu(long int dd,long int ss)
{
	nod *pp;
	if(!prim[dd])
	 { prim[dd]=new nod;
	   prim[dd]->fiu=ss;
	   prim[dd]->next=0;
	   ultim[dd]=prim[dd];
	   return;
	 }
	pp=new nod;
	pp->fiu=ss;
	pp->next=0;
	ultim[dd]->next=pp;
	ultim[dd]=pp;
}