Cod sursa(job #134960)

Utilizator floringh06Florin Ghesu floringh06 Data 12 februarie 2008 18:58:16
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 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;
    }