Pagini recente » Borderou de evaluare (job #2796412) | Borderou de evaluare (job #1119344) | Borderou de evaluare (job #2796664) | Borderou de evaluare (job #2130292) | Cod sursa (job #3365732)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5;
int dp[MAXN + 1] , k[MAXN + 1] , par[MAXN + 1];
vector< int >ancestors;
vector< int >edges[MAXN + 1];
void dfs( int nod ) {
ancestors.push_back( nod );
for( auto x : edges[nod] ) {
//cout << k[x] << '\n';
if( k[x] ) {
dp[x] = dp[ancestors[ancestors.size() - k[x]]] + 1;
//cout << ancestors[ancestors.size() - k[x]] << ' ' << dp[ancestors[ancestors.size() - k[x]]] << ' ' << x << '\n';
}
dfs( x );
}
ancestors.pop_back();
}
int main() {
ifstream cin( "cerere.in" );
ofstream cout( "cerere.out" );
int n , i , a , b;
cin >> n;
for( i = 1 ; i <= n ; i++ )
cin >> k[i];
for( i = 1 ; i < n ; i++ ) {
cin >> a >> b;
edges[a].push_back( b );
par[b] = 1;
}
for( i = 1 ; i <= n ; i++ )
if( !par[i] )
dfs( i );
for( i = 1 ; i <= n ; i++ )
cout << dp[i] << ' ';
cout << '\n';
return 0;
}