Cod sursa(job #1726550)

Utilizator catu_bogdan_99Catu Bogdan catu_bogdan_99 Data 8 iulie 2016 12:44:13
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#include <vector>
#include <stack>
using namespace std;

#define NMAX 100005
#define INFI 0x3f3f3f

vector < int > v[ NMAX ];

int cont;
int stiva[ NMAX ];
int dist[ NMAX ];
int gradStramos[ NMAX ];
int gradNod[ NMAX ];

void compute( int nod ){

    stiva[ ++cont ] = nod;

    int n, i, fiu, stramos;

    stramos = stiva[ cont - gradStramos[ nod ] ];
    if( gradStramos[ nod ] != 0 )
        dist[ nod ] = dist[ stramos ] + 1;

    for( i = 0; i < v[ nod ].size(); ++i ){
        fiu = v[ nod ][ i ];
        compute( fiu );
    }

    --cont;

}

int main()
{

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

    int n, m, i, j, s, t, d, x, y;

    scanf("%d",&n);
    for( i = 1; i <= n; ++i ) scanf("%d",&gradStramos[ i ]);

    for( i = 1; i < n; ++i ){
        scanf("%d%d",&x,&y);
        v[ x ].push_back( y );
        gradNod[ y ]++;
    }

    for( i = 1; i <= n; ++i ){
        if( !gradNod[ i ] ){
            compute( i );
            i = n;
        }
    }

    for( i = 1; i <= n; ++i )
        printf("%d ",dist[ i ]);


    return 0;

}