Cod sursa(job #554964)

Utilizator david_raucaRauca Ioan David david_rauca Data 15 martie 2011 10:49:17
Problema Cerere Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<fstream>
using namespace std;

ifstream fin("cerere.in");
ofstream fout("cerere.out");

int n;
int a[100001], t[100001], sol[100001], nivel[100001];               // t - sirul de tati
                                                                    // sol - solutia
void Read();                                                        // nivel - sirul de nivele
void Solve();                                                       // a - sirul stramosilor la care este trimisa cererea
void DF(int x, int nod);
void Write();

int main()
{
    Read();
    Solve();
    
    fin.close();
    fout.close();
    
    return 0;
}

void Read()
{
     fin >> n;
     for( int i = 1; i <= n; ++i )
          fin >> a[i];
     int x, y;
     for( int i = 1; i <= n-1; ++i )
     {
          fin >> x >> y;
          t[y] = x;                                                    // tatal lui y este x
     }
}

void Solve()
{
     for( int i = 1; i <= n; ++i )
          if( t[i] == 0 )                            //radacina
          {
              DF( i, 1);
              Write();
              return;
          }
}

void DF( int x, int niv )
{
     nivel[niv] = x;                                           // pe nivelul niv se afla nodul x
     
     if( a[x] != 0 )                                           // daca a[x] == 0 solutia este 0;
         sol[x] = sol[ nivel[ niv - a[x] ] ] + 1;              // ne uitam in sol [ nodului care se afla la nivelul[ nivelului curent - la al catelea stramos trebuie trimisa crererea ] + 1. 
     
     for( int i = 1; i <= n; ++i )
          if( t[i] == x )
              DF( i, niv+1 );
}

void Write()
{
     for( int i = 1; i <= n; ++i )
          fout << sol[i] << ' ';
}