Pagini recente » Cod sursa (job #56305) | Cod sursa (job #2673103) | Cod sursa (job #1589454) | Cod sursa (job #21305) | Cod sursa (job #1232094)
#include <cstdio>
#include <assert.h>
#include <vector>
#define Nmax 100005
using namespace std;
int str[Nmax],tata[Nmax],N,sol[Nmax],st[Nmax],top,stramos[Nmax];
vector <int> L[Nmax];
inline void Dfs(int nod)
{
vector <int> ::iterator it;
if(!str[nod])
sol[nod]=1;
else
sol[nod]=1+sol[stramos[nod]];
for(it=L[nod].begin();it!=L[nod].end();++it)
Dfs(*it);
}
inline void Dfs1(int nod)
{
vector <int> ::iterator it;
st[++top]=nod; stramos[nod]=st[top-str[nod]];
for(it=L[nod].begin();it!=L[nod].end();++it)
Dfs1(*it);
--top;
}
int main()
{
int y,x,i,rad;
freopen ("cerere.in","r",stdin);
freopen ("cerere.out","w",stdout);
scanf("%d", &N);
for(i=1;i<=N;++i)
scanf("%d", &str[i]);
for(i=1;i<N;++i)
{
scanf("%d%d", &x,&y);
L[x].push_back(y);
tata[y]=x;
}
for(i=1;i<=N;++i)
if(!tata[i]) rad=i;
Dfs1(rad);
Dfs(rad);
for(i=1;i<=N;++i)
printf("%d ", sol[i]-1);
printf("\n");
return 0;
}