Pagini recente » Cod sursa (job #3150867) | Cod sursa (job #306688) | Cod sursa (job #1915265) | Cod sursa (job #300852) | Cod sursa (job #1059263)
#include <stdio.h>
#include <vector>
#define NMAX 100010
using namespace std;
int N, rad, nivel, y, rasp[NMAX], drum[NMAX], K[NMAX], viz[NMAX], tati[NMAX];
vector <int> vf[NMAX];
void dfs(int x){
viz[x] = 1;
drum[++nivel] = x;
if(K[x] != 0){
rasp[x] = 1 + rasp[drum[nivel - K[x]]];
}
for(int i = 0; i < vf[x].size(); i++){
y = vf[x][i];
if(viz[y] == 0){
dfs(y);
}
}
nivel--;
}
int main(){
freopen("cerere.in", "r", stdin);
freopen("cerere.out", "w", stdout);
int i, x, y;
scanf("%d", &N);
for(i = 1; i <= N; i++){
scanf("%d", &K[i]);
}
for(i = 1; i < N; i++){
scanf("%d%d", &x, &y);
tati[y] = x;
vf[x].push_back(y);
}
for(i = 1; i <= N; i++){
if(tati[i] == 0){
rad = i;
break;
}
}
dfs(rad);
for(i = 1; i <= N; i++){
printf("%d ", rasp[i]);
}
}