Pagini recente » Cod sursa (job #195549) | Cod sursa (job #2265859) | Cod sursa (job #1606929) | Cod sursa (job #2792495) | Cod sursa (job #605796)
Cod sursa(job #605796)
#include <stdio.h>
#include <assert.h>
#include <vector>
#define NMax 100010
using namespace std;
const char IN[]="cerere.in",OUT[]="cerere.out";
int N,L;
int a[NMax] , T[NMax];
vector<int> ad[NMax] ;
bool visit[NMax];
int v[NMax];
void dfs(int x=1)
{
visit[x]=true;
if (a[x] && x!=1) T[x]=T[v[L-a[x]]]+1;
v[L++]=x;
for (vector<int>::iterator it=ad[x].begin();it<ad[x].end();++it) if (!visit[*it])
dfs(*it);
--L;v[L]=0;
}
int main()
{
int i,x,y;
freopen(IN,"r",stdin);
scanf("%d",&N);
for (i=1;i<=N;++i) scanf("%d",a+i);
for (i=1;i<N;++i)
scanf("%d%d",&x,&y),
ad[x].push_back(y),
ad[y].push_back(x);
fclose(stdin);
a[1]=0;
dfs();
freopen(OUT,"w",stdout);
for (i=1;i<=N;++i)
printf("%d ",T[i]);
printf("\n");
fclose(stdout);
return 0;
}