Cod sursa(job #299237)

Utilizator rethosPaicu Alexandru rethos Data 6 aprilie 2009 17:19:45
Problema Cerere Scor 100
Compilator cpp Status done
Runda preONI Marime 0.93 kb
#include <stdio.h>
#define NM 100001
int st[NM],r[NM],ka[NM];
int n,vf;
int v[NM];
int gr[NM];
int str[NM];
struct list{int nod; list* urm;} *g[NM];
void df(int);
int calc(int);
inline void add(int x,int y)
{list *p=new list;
 p->nod=y;
 p->urm=g[x];
 g[x]=p;
}
int main()
{freopen("cerere.in","r",stdin);
 freopen("cerere.out","w",stdout);
 scanf("%d",&n); 
 int i;
 for (i=1;i<=n;i++) 
	 {v[i]=-1;
	  scanf("%d",&ka[i]);
	 }
 int x,y;	 
 for (i=1;i<n;i++)
	 {scanf("%d %d",&x,&y);
	  add(x,y);
	  gr[y]++;
	 } 
 for (i=1;i<=n;i++)
	 if (gr[i]==0) break;
 df(i);
 for (i=1;i<=n;i++)
	 if (v[i]==-1)
		 v[i]=calc(i);
 for (i=1;i<=n;i++) printf("%d ",v[i]);
 return 0;
}
void df(int k)
{++vf;
 st[vf]=k;
 str[k]=st[vf-ka[k]];
 list *p;
 for (p=g[k];p;p=p->urm)
	 {df(p->nod);
	 }
 vf--;	 
}
int calc(int k)
{if (str[k]==k) return 0;
 if (v[str[k]]==-1) v[str[k]]=calc(str[k]);
 return v[str[k]]+1; 	 
}