Pagini recente » Cod sursa (job #1049921) | Cod sursa (job #478) | Cod sursa (job #802774) | Cod sursa (job #425288) | Cod sursa (job #316542)
Cod sursa(job #316542)
#include<cstdio>
#include<vector>
#define MAXN 100005
using namespace std;
int i , j , N , a, b, elder[MAXN] , rez[MAXN] , stack[MAXN] , top , ok , X , Y ,mark[MAXN];
vector <int> Tree[MAXN];
void DFS(int X)
{
int i;
stack[++top] = X;
while ( top )
{
X = stack[top] , ok = 0;
Y = top;
rez[X] = 0;
while(elder[stack[Y]])
{
rez[X]++;
Y -= elder[stack[Y]];
}
for( i = 0 ; i < Tree[X].size(); ++i)
if( rez[Tree[X][i]] == - 1) { ok = 1; break;}
if(ok) stack[++top] = Tree[X][i];
else --top;
}
}
int main()
{
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
scanf("%d",&N);
for( i = 1 ; i <= N ; i++ ){
scanf("%d ", &elder[i]);
rez[i] = -1;
}
for( i = 1 ; i <= N - 1 ; i++) {
scanf("%d %d",&a,&b);
Tree[a].push_back(b);
Tree[b].push_back(a);
mark[b] = 1;
}
for( i = 1 ; i <= N ; i++)
if(!mark[i]){rez[i] = 0; break;}
DFS(i);
for( i = 1 ; i <= N ; i++)
printf("%d ",rez[i]);
return 0;
}