Cod sursa(job #1368956)

Utilizator DorelBarbuBarbu Dorel DorelBarbu Data 2 martie 2015 20:45:30
Problema Cerere Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;

const int MAXN = 100000, INF = 200000000;

int T[MAXN+1], level[MAXN+1], sol[MAXN+1], K[MAXN+1], N, root[MAXN+1];
vector <int> G[MAXN+1];

void citire()
{
    scanf("%d",&N);
    for(int i = 1; i <= N; i++)
    {
        scanf("%d",&K[ i ]);
        if( K[ i ] == 0 )
            sol[ i ] = 0;
        else sol[ i ] = INF;
    }

    for(int i = 1; i <= N - 1; i++)
    {
        int a, b; scanf("%d %d",&a,&b);
        G[ a ].push_back( b );
        root[ b ] = 1;
    }

}

void testCitire()
{
    for(int i = 1; i <= N; i++)
    {
        cout<<i<<"   ";
        for(int j = 0; j < G[ i ].size(); j++)
            cout<<G[ i ][ j ]<<' ';
        cout<<endl;
    }
}

vector <int> drum;

void dfs(int nod)
{
    /*
    if( G[ nod ].size() == 0 )
    {
        for(int i = 0; i < drum.size(); i++)
            cout<<drum[ i ]<<' ';
        cout<<endl;
    }*/

    for(int i = 0; i < G[ nod ].size(); i++)
    {
        int next = G[ nod ][ i ];
        drum.push_back( next );
        if( sol[ next ] != 0 )
            sol[ next ] = 1 + sol[ drum[ drum.size() - K[ next ] - 1 ] ];
        dfs( next );
        drum.pop_back();
    }
}

int main()
{
    freopen("cerere.in","r",stdin);
    freopen("cerere.out","w",stdout);

    citire();


    for(int i = 1; i <= N; i++)
        if( root[ i ] == 0 )
        {
            drum.push_back( i );
            sol[ i ] = 0;
            dfs( i );
            break;
        }

    for(int i = 1; i <= N; i++)
        printf("%d ",sol[ i ]);
    //testCitire();
}