Cod sursa(job #535060)

Utilizator david_raucaRauca Ioan David david_rauca Data 16 februarie 2011 18:37:53
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<fstream>
#include<vector>
using namespace std;

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

int n; int sum, k;
//int nr;

int t[100005];

vector<vector<int> > G;
vector<int> M;

void Read();
void Solve();
void DF( int x );
void Find( int x, int nod, int nr );

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

void Read()
{
     fin >> n;
     G.resize(n+1);
     M.resize(n+1);
     for( int i = 1; i <= n; ++i )
          fin >> M[i];
     
     int x, y;
     while( fin >> x >> y )
            G[x].push_back(y);
}

void Solve()
{
     t[1] = 0;
     DF(1); 
     for( int i = 1; i <= n; ++i )
     {
          k = i;
          int nr = 0;
          sum = 0;
          while( M[k] != 0 )
          {
                 Find( M[k], k, nr );
                 sum++;
          }
          fout << sum << ' ';
     }
}

void DF( int x )
{
     for( int i = 0; i < G[x].size(); ++i )
     {
          t[ G[x][i] ] = x;
          DF( G[x][i] );
     }
}

void Find( int x, int nod, int nr )
{
    if( x == 0 )
    {
        k = nod;
        return;
    }
        
    Find( x-1, t[nod], nr+1 );
    //sum++;
}