Cod sursa(job #2201949)

Utilizator borscalinCalin-Stefan Georgescu borscalin Data 6 mai 2018 18:44:38
Problema Cerere Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
#include <stdlib.h>
#define NMAX 100000

int nr, n, lst[1 + NMAX], urm[1 + 2 * NMAX], vf[1 + 2 * NMAX], v[1 + NMAX], d[1 + NMAX], a[1 + NMAX], ans = NMAX, t;
char viz[1 + NMAX], smart[1 + NMAX];

void adauga ( int x, int y ) {
    ++nr;
    vf[nr] = y;
    urm[nr] = lst[x];
    lst[x] = nr;
}

void dfs ( int x ) {
    viz[x] = 1;
    int p = lst[x], y, c, cnt = 0;
    d[++t] = x;
    c = t;

    if ( v[x] )
        a[x] = a[d[t - v[x]]] + 1;

    while ( p != 0 ) {
        y = vf[p];
        if ( !viz[y] )
            dfs ( y );
        p = urm[p];
    }
    --t;
}

int main() {
    int i, x, y;
    FILE *fin = fopen ( "cerere.in", "r" );
    fscanf ( fin, "%d", &n );
    for ( i = 1; i <= n; ++i )
        fscanf ( fin, "%d", &v[i] );
    for ( i = 1; i <= n; ++i ) {
        fscanf ( fin, "%d%d", &x, &y );
        adauga ( x, y );
        smart[y] = 1;
    }
    fclose ( fin );

    for ( int i = 1 ; i <= n ; i++ )
        if ( !smart[i] )
            dfs ( i );

    FILE *fout = fopen ( "cerere.out", "w" );
    for ( int i = 1 ; i <= n ; i++ )
        fprintf ( fout, "%d ", a[i] );
    fclose ( fout );

    return 0;
}