Cod sursa(job #141519)

Utilizator BuniakovskiNeguletu Octavian Buniakovski Data 23 februarie 2008 12:43:34
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <cstdio>     
#include <cstring>   
#include <vector>    
#include <algorithm>    
     
using namespace std;     
     
#define MAX_N 100005     
#define FIN "cerere.in"   
#define FOUT "cerere.out"   
     
int N, i;   
int A[MAX_N];   
int B[MAX_N];     
int C[MAX_N];   
int S[MAX_N];   
  
vector<int> G[MAX_N];     
  
int TQ;     
  
    void readdata ()   
    {      
        int x,ind,i = -1;            
        char sir[600000];      
        gets(sir);    
        x = ind = 0;      
        int L = strlen(sir);      
        for (ind = 0; ind <= L; ++ind)      
        {      
            if (sir[ind] >= '0' && sir[ind] <= '9')      
               x = x * 10 + (sir[ind] - '0');      
            if (sir[ind]==' ' || sir[ind]== '\n' || ind == L)       
            {      
                A[++i] = x;      
                x = 0;      
            }             
        }           
    }      
     
    void solve ()    
    {   
         int i;   
         int a, b, Q;   
         for(i = 0; i < N - 1; ++i)    
         {     
               scanf("%d %d", &a, &b);    
               --a; --b; ++B[b];      
               G[a].push_back(b);       
         }     
     
         for(i = 0; i < N; ++i)    
               if(!B[i])     
               {     
                          Q = i;   
                          break;   
               }   
       
         for(S[TQ++] = Q; TQ; )    
         {     
              a = S[TQ - 1];     
              if (!C[a])    
              {     
                 C[a] = C[S[TQ - A[a] - 1]] + 1; A[a] = 0;     
              }    
              else    
                   if(A[a] < G[a].size())     
                           S[TQ++] = G[a][A[a]++];     
                                     else --TQ;     
         }                             
     
         for(i = 0; i < N; ++i)     
               printf("%d ", C[i] - 1);     
    }   
     
    int main()     
    {     
         freopen(FIN, "r", stdin);     
         freopen(FOUT, "w", stdout);     
         
         scanf("%d\n", &N);     
            
         readdata ();   
            
         solve ();   
       
         return 0;   
    }