Pagini recente » Cod sursa (job #689349) | Cod sursa (job #675318) | Cod sursa (job #2164742) | Cod sursa (job #216463) | Cod sursa (job #959822)
Cod sursa(job #959822)
#include <cstdio>
#include <vector>
#define MAXN 100003
using namespace std;
int i, N, M, j, A, B, head, x;
int K[MAXN], ANC[MAXN], st[MAXN], Mk[MAXN], sol[MAXN];
vector <int> v[MAXN];
bool used[MAXN];
inline void DFS(int nod) {
used[nod] = true;
st[++head] = nod;
ANC[nod] = st[head - K[nod]];
sol[nod] = Mk[ANC[nod]] + 1;
if (K[nod] == 0) Mk[nod] = 0, sol[nod] = 0;
vector <int> :: iterator it, fin;
it = v[nod].begin(); fin = v[nod].end();
for (; it != fin; ++it) {
if (!used[*it]) {
Mk[*it] = Mk[nod] + 1;
DFS(*it);
}
}
--head;
}
int main() {
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
scanf("%i", &N); M = N - 1;
for (i = 1; i <= N; ++i) scanf("%i", &K[i]);
while (M--) {
scanf("%i%i", &A, &B);
v[A].push_back(B);
v[B].push_back(A);
}
for (i = 1; i <= N; ++i)
if (!K[i] && !used[i]) DFS(i);
for (i = 1; i <= N; ++i)
printf("%i ", sol[i]);
printf("\n");
return 0;
}