Pagini recente » Cod sursa (job #3137199) | Cod sursa (job #2460575) | Cod sursa (job #1834282) | Cod sursa (job #1358009) | Cod sursa (job #1712986)
#include <cstdio>
#define MAX 100000
using namespace std;
int r, lista[MAX+1], next[MAX], val[MAX];
int m, grf[MAX+1], nxt[MAX], nod[MAX], str[MAX+1], gr[MAX+1], rasp[MAX+1];
inline void adauga(int x, int y)
{
val[++r]=y;
next[r]=lista[x];
lista[x]=r;
gr[y]++;
}
inline void adauga2(int x, int y)
{
nod[++m]=y;
nxt[m]=grf[x];
grf[x]=m;
}
int st[MAX+1];
void dfs1(int n, int lev)
{
int p, vecin;
p=lista[n];
st[lev]=n;
if(str[n])
adauga2(st[lev-str[n]], n);
while(p)
{
vecin=val[p];
dfs1(vecin, lev+1);
p=next[p];
}
}
void dfs2(int n, int pas)
{
int p;
rasp[n]=pas;
p=grf[n];
while(p)
{
dfs2(nod[p], pas+1);
p=nxt[p];
}
}
int main()
{
freopen("cerere.in", "r", stdin);
freopen("cerere.out", "w", stdout);
int n,x, y, nr;
scanf("%d", &n);
for(int i=1;i<=n;++i)
scanf("%d", &str[i]);
for(int i=1;i<n;++i)
{
scanf("%d%d", &x, &y);
adauga(x, y);
}
for(int i=1;i<=n;++i)
if(!gr[i])
nr=i;
dfs1(nr, 1);
for(int i=1;i<=n;++i)
if(!str[i])
dfs2(i, 0);
for(int i=1;i<=n;++i)
printf("%d ", rasp[i]);
return 0;
}