Cod sursa(job #446010)

Utilizator irene_mFMI Irina Iancu irene_m Data 24 aprilie 2010 18:50:21
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>
#define infile "cerere.in"
#define outfile "cerere.out"
#define MaxN 100024

struct edge{
      int x;
      edge *next;
}     *G[MaxN];

int sol[MaxN],a[MaxN],uz[MaxN],K[MaxN];
int N,R;

void add(int x,int y)
{
      edge *q=new edge;
      q->x=y; q->next=G[x]; G[x]=q;
}

void read()
{
      int i,A,B;
      scanf("%d",&N);
      for(i=1;i<=N;i++)
            scanf("%d",&K[i]);

      for(i=1;i<N;i++)
      {
            scanf("%d%d",&A,&B);
            add(A,B);
            uz[B]=1;
      }
}

void dfs(int nod,int niv)
{
      a[niv]=nod;

      if(K[nod])
            sol[nod]=sol[a[niv-K[nod]]]+1;
      else
            sol[nod]=0;

      edge *q;
      for(q=G[nod];q;q=q->next)
            dfs(q->x,niv+1);
}

void solve()
{
      int i;
      for(i=1;i<=N && !R;i++)
            if(!uz[i])
                  R=i;

      dfs(R,1);
}

void write()
{
      int i;
      for(i=1;i<=N;i++)
            printf("%d ",sol[i]);
}

int main()
{
      freopen(infile,"r",stdin);
      freopen(outfile,"w",stdout);

      read();
      solve();
      write();

      fclose(stdin);
      fclose(stdout);
      return 0;
}