Cod sursa(job #289)

Utilizator adyshorcont de teste adyshor Data 8 decembrie 2006 17:27:42
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<stdio.h>


long  n , i , j , k , x , y;

long cit[100001];
long bif1[100001] , nodd;
long bif[100001];
long stiva[100001];
long nr = 1 , ind ;
long int sir[100001] ;

struct Nod
{
       long nod;
       Nod* adr_urm;
};
Nod *L[100001];

void df1(long nodd)
{
     Nod *p;

     stiva[nr] = nodd;
     p = L[nodd];
     bif1[nodd] = 1;
     ind = 0;
     while(p)
     {
             if (bif1[p->nod]==0)
             {
                nr++;
                stiva[nr] = p->nod;
                bif1[p->nod] = 1;
                if (cit[p->nod] == 0)
                   sir[p->nod] = 0;
                else
                sir[p->nod] = sir[stiva[nr-cit[p->nod]]]+1;
                ind = 1;
                df1(p->nod);
             }
             p = p->adr_urm;
             
     }
     if (ind==0)
        nr--;
}
void citire()
{
     Nod *p;
     long i , j;
     scanf("%ld",&n);
     for (i = 1 ; i<= n ; i++) scanf("%ld",&cit[i]);  
     for (i = 1 ; i<= n ; i++) L[i] = 0;
     for (i = 1 ; i< n ; i++)
     {
         scanf("%ld%ld",&x,&y);
         bif[y] = 1;
         p = new Nod;
         p->adr_urm=L[x];
         p->nod = y;
         L[x] = p;
         
     }
         
}
int main()
{
    
    freopen("cerere.in","r",stdin);
    freopen("cerere.out","w",stdout);
    
    citire();

    for (i = 1 ; i<= n ; i++) if (bif[i]==0) 
    {
    nodd = i;
    break;
    }
    df1(nodd);
    sir[nodd] = 0;

    for (i = 1 ; i<= n ; i++)
    {
        if (cit[i]==0)
          printf("0 ");
        else
        printf("%ld ",sir[i]);
    }
    
    return 0;
}