Pagini recente » Cod sursa (job #658509) | Cod sursa (job #1552140) | Cod sursa (job #1717420) | Cod sursa (job #2453849) | Cod sursa (job #2201949)
#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;
}