Cod sursa(job #1032780)

Utilizator Teodor94Teodor Plop Teodor94 Data 16 noiembrie 2013 01:32:38
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <vector>

using namespace std;

#define MAX_N 100000

bool has_father[MAX_N];
int k[MAX_N];
vector< int > v[MAX_N];
int stack[MAX_N], ans[MAX_N];

void read( FILE *fin, int &n ) {
    fscanf( fin, "%d", &n );
    for ( int i = 0; i < n; ++i )
        fscanf( fin, "%d", &k[i] );
    for ( int i = 1; i < n; ++i ) {
        int x, y;
        fscanf( fin, "%d%d", &x, &y );
        --x, --y;

        v[x].push_back( y );
        has_father[y] = true;
    }
}

int search_root( int n ) {
    int root = 0;
    while ( has_father[root] )
        ++root;
    return root;
}

void dfs( int node, int len ) {
    for ( vector< int >::iterator it = v[node].begin(); it != v[node].end(); ++it )
        if ( !ans[*it] ) {
            stack[++len] = *it;
            ans[*it] = ans[stack[len - k[*it]]] + 1;
            dfs( *it, len );
            --len;
        }
}

int main() {
    FILE *fin, *fout;

    fin = fopen( "cerere.in", "r" );
    int n;
    read( fin, n );
    fclose( fin );

    int root = search_root( n ), len = 0;

    stack[0] = root;
    ans[root] = 1;
    dfs( root, len );

    fout = fopen( "cerere.out", "w" );
    for ( int i = 0; i < n; ++i )
        fprintf( fout, "%d ", ans[i] - 1 );
    fclose( fout );
}