Pagini recente » Cod sursa (job #1232846) | Cod sursa (job #2124402) | Cod sursa (job #1938114) | Cod sursa (job #3151854) | Cod sursa (job #1438310)
#include <cstdio>
using namespace std;
int const N = 100001;
int nr,vf[N],urm[N],lst[N],v[N];
bool rad[N],viz[N];
int cost[N],t[N];
void addEdge(int x, int y)
{
vf[++nr] = y;
urm[nr] = lst[x];
lst[x] = nr;
}
void dfs(int p)
{
viz[p] = true;
t[++nr] = p;
if(v[p] == 0) cost[p] = 0;
else
cost[p] = cost[t[nr - v[p]]] + 1;
p = lst[p];
while(p != 0)
{
int y = vf[p];
if(!viz[y]) dfs(y);
p = urm[p];
}
nr--;
}
int main()
{
int i,n,p,x,y;
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
for(i=1;i<n;i++)
{
scanf("%d %d",&x,&y);
addEdge(x,y);
rad[y] = true;
}
for(i=1;i<=n;i++)
if(!rad[i]) p = i;
nr = 0;
dfs(p);
for(i=1;i<=n;i++)
printf("%d ",cost[i]);
return 0;
}