Pagini recente » Cod sursa (job #288956) | Cod sursa (job #3265761) | Cod sursa (job #364696) | Cod sursa (job #631010) | Cod sursa (job #2615452)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
const int NMAX = 100000;
int lista[NMAX + 1], f[NMAX + 1];
int nr, dp[NMAX + 1], k[NMAX + 1];
vector<int> G[NMAX + 1];
void dfs( int node, int father ) {
lista[++nr] = node;
dp[node] = (dp[lista[nr - k[node]]] + 1) * (k[node] != 0);
for( const auto &it : G[node] ) {
if( it != father )
dfs(it, node);
}
nr --;
}
int main() {
int n;
fin>>n;
for( int i = 1; i <= n; i ++ ) {
fin>>k[i];
}
for( int i = 1; i < n; i ++ ) {
int a, b;
fin>>a>>b;
G[a].push_back(b);
G[b].push_back(a);
f[b]++;
}
int rad;
for( int i = 1; i <= n; i ++ )
if( f[i] == 0 )
rad = i;
dfs(rad, 0);
for( int i = 1; i <= n; i ++ )
fout<<dp[i]<<" ";
return 0;
}