Pagini recente » Cod sursa (job #1755673) | Cod sursa (job #3191680) | Cod sursa (job #1856972) | Cod sursa (job #1409631) | Cod sursa (job #2454774)
#include <bits/stdc++.h>
using namespace std;
int v[100007];
int tata[100007];
int len[100007];
int st[100007];
int f[100007];
int st_len = 0;
vector< int > g[100007];
void dfs1(int poz)
{
tata[poz] = st[st_len - v[poz]];
st[st_len] = poz;
st_len++;
for(int i = 0; i < g[poz].size(); i++)
{
dfs1(g[poz][i]);
}
st_len--;
}
int dfs(int poz)
{
if(len[poz] != -1)
return len[poz];
int track = poz;
track = tata[track];
len[poz] = dfs(track) + 1;
return len[poz];
}
int main()
{
//freopen("cerere.in","r",stdin);
//freopen("cerere.out","w",stdout);
int n, x, y;
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
scanf("%d",&v[i]);
len[i] = -1;
if(v[i] == 0)
len[i] = 0;
}
int start;
for(int i = 1; i < n; i++)
{
scanf("%d %d",&x,&y);
g[x-1].push_back(y-1);
f[y-1] = 1;
}
for(int i = 0; i < n; i++)
{
if(f[i] == 0)
start = i;
}
st[0] = start;
dfs1(start);
for(int i = 0; i < n; i++)
printf("%d ",dfs(i));
}