Pagini recente » Cod sursa (job #204279) | Clasament info_cnmv | Cod sursa (job #927844) | Cod sursa (job #2132515) | Cod sursa (job #1032778)
#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;
for ( int i = 0; i < n; ++i )
for ( vector< int >::iterator it = v[i].begin(); it != v[i].end(); ++it )
printf( "%d %d\n", i, *it );
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 );
}