Pagini recente » Cod sursa (job #2094371) | Cod sursa (job #2788247) | Cod sursa (job #2532355) | Cod sursa (job #285450) | Cod sursa (job #672595)
Cod sursa(job #672595)
#include<cstdio>
#include<vector>
#define MAXN 100005
using namespace std;
vector<int> TR[MAXN];
int st[MAXN], k[MAXN], n, tata[MAXN], next[MAXN], viz[MAXN], d[MAXN];
int main()
{
freopen("cerere.in", "r", stdin);
freopen("cerere.out", "w", stdout);
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &k[i]);
int a,b;
for(int i = 1; i < n; i++)
{
scanf("%d%d", &a, &b);
TR[a].push_back(b);
tata[b] = a;
}
int rad = 1;
while(tata[rad] != 0)
rad = tata[rad];
int top = 1;
st[top] = rad;
while(top > 0)
{
int nod = st[top];
if(k[nod] > 0)
d[nod] = d[st[top - k[nod]]] + 1;
if(viz[nod] == 0 && TR[nod].size() != 0)
{
top++;
st[top] = TR[nod][0];
next[top] = 1;
viz[st[top - 1]] = 1;
}
else
if(next[top] < TR[st[top - 1]].size())
{
st[top] = TR[st[top - 1]][next[top]];
next[top]++;
}
else top--;
}
for(int i = 1; i <= n; i++)
printf("%d ", d[i]);
return 0;
}