Cod sursa(job #316542)

Utilizator klamathixMihai Calancea klamathix Data 19 mai 2009 22:51:48
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<cstdio>
#include<vector>
#define MAXN 100005

using namespace std;

int i , j , N , a, b, elder[MAXN] , rez[MAXN] , stack[MAXN] , top , ok , X , Y ,mark[MAXN];

vector <int> Tree[MAXN];

void DFS(int X)
{
     int i;
     
     stack[++top] = X;
     
     while ( top )
     {
           X = stack[top] , ok = 0;
           Y = top;
           rez[X] = 0;
           
           while(elder[stack[Y]])
           {
             rez[X]++;
             Y -= elder[stack[Y]]; 
           }
           
           for( i = 0 ; i < Tree[X].size(); ++i)
                 if( rez[Tree[X][i]] == - 1) { ok = 1; break;}
           
           if(ok) stack[++top] = Tree[X][i];
                  else --top;
     }

}

int main()
{
    freopen("cerere.in","r",stdin);
    freopen("cerere.out","w",stdout);
    
    scanf("%d",&N);
    
    for( i = 1 ; i <= N ; i++ ){
         scanf("%d ", &elder[i]);
         rez[i] = -1;
         }
    
    for( i = 1 ; i <= N - 1 ; i++) {
         scanf("%d %d",&a,&b);
         Tree[a].push_back(b);
         Tree[b].push_back(a);
         mark[b] = 1;
         }

     for( i = 1 ; i <= N ; i++)
     if(!mark[i]){rez[i] = 0; break;}
     
     DFS(i);
     
     for( i = 1 ; i <= N ; i++)
          printf("%d ",rez[i]);
          

return 0;
}