Cod sursa(job #80145)

Utilizator Darth_NiculusIvan Nicolae Darth_Niculus Data 26 august 2007 15:21:38
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
/* Ivan Nicolae - Bucuresti */
/* Infoarena - Cerere */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define NMAX 100001
#define _fin  "cerere.in"
#define _fout "cerere.out"

int i,n,Gr[NMAX],C[NMAX],kStr[NMAX],T[NMAX],R,St[NMAX],Mark[NMAX],j;
int* A[NMAX];

void DF(int nod)
{
 int i;
 Mark[nod]=1;
 St[++St[0]]=nod;
// printf("NOD DFS: %d \n",nod);

 C[nod]=1 + C[St[St[0]-kStr[nod]]];
 
 for (i=1;i<=A[nod][0];i++)
    if (!Mark[A[nod][i]])
      DF(A[nod][i]);

 St[St[0]--]=0; 
}

int main(void)
{
 freopen(_fin,"r",stdin);
 freopen(_fout,"w",stdout);

 scanf("%d",&n);
 for (i=1;i<=n;i++)
    scanf("%d",&kStr[i]);
 for (i=1;i<=n-1;i++)
    {
     int x,y;
     scanf("%d%d",&x,&y);
     Gr[x]++; T[y]=x;
    } 

 fseek(stdin,0,SEEK_SET);

 for (i=1;i<=n;i++)
    {
     A[i] = (int*) malloc((Gr[i]+1)*sizeof(int));
     memset(A[i],0,sizeof(A[i]));
    }

 scanf("%d",&n);
 for (i=1;i<=n;i++)
    scanf("%d",&kStr[i]);
 for (i=1;i<=n-1;i++)
    {
     int x,y;
     scanf("%d%d",&x,&y);
     A[x][++A[x][0]]=y;
    }

 memset(C,0,sizeof(C));
 for (i=1;i<=n;i++)
    if (!T[i])
      { R=i; break; }

 DF(R);

 for (i=1;i<=n;i++)
    printf("%d ",C[i]-1); 

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