Cod sursa(job #289310)

Utilizator flamecataCiobanu Alexandru-Catalin flamecata Data 26 martie 2009 17:45:44
Problema Cerere Scor 100
Compilator cpp Status done
Runda aa Marime 1.06 kb
#include<stdio.h>   
#include<string.h>   
using namespace std;   
  
typedef struct nod{int val;   
        nod* urm;}*NOD;   
  
char viz[100002];   
NOD a[100002];   
int v[100005],sol[100002],nr[100002],i,j,k,l,m,n,p,q;   
void add(int x,int val){   
NOD p=new nod;   
p->val=val;   
p->urm=a[x];   
a[x]=p;   
}   
  
void df(int x,int lvl){   
v[lvl]=x;   
if(nr[x]&&sol[v[lvl-nr[x]]]+1<sol[x])   
        sol[x]=sol[v[lvl-nr[x]]]+1;   
else   
if(!nr[x])sol[x]=0;   
for(NOD p=a[x];p;p=p->urm)   
        df(p->val,lvl+1);   
           
  
  
}   
int main(){   
  
freopen("cerere.in","r",stdin);   
freopen("cerere.out","w",stdout);   
  
scanf("%d",&n);   
  
for(i=1;i<=n;i++)   
        {scanf("%d",&nr[i]);   
        sol[i]=100002;}   
for(i=1;i<n;i++)   
        {scanf("%d %d",&p,&q);   
        add(p,q);   
        viz[q]=1;   
        }   
  
i=1;   
for(i=1;i<=n;i++)   
        {i=i;   
        if(viz[i]==0)   
                df(i,1);  }   
  
for(i=1;i<=n;i++)   
        printf("%d ",sol[i]);   
  
return 0;}