Pagini recente » Cod sursa (job #1473369) | Cod sursa (job #1473389) | Cod sursa (job #1580769) | Autentificare | Cod sursa (job #1744766)
#include <cstdio>
#include <vector>
using namespace std;
#define MAXN 100000
vector <int> G[MAXN+1];
int father[MAXN+1];
int k[MAXN+1];
int dp[MAXN+1];
int v[MAXN+1];
int stiv[MAXN+1];
char vf[MAXN+1];
void DFS1(int nod,int n){
int i;
stiv[n]=nod;
if(father[nod]>0)
v[nod]=stiv[n-k[nod]];
for(i=0;i<G[nod].size();i++)
DFS1(G[nod][i],n+1);
}
void DFS2(int nod){
int i,x;
if(vf[nod]==0){
DFS2(v[nod]);
vf[nod]=1;
dp[nod]=dp[v[nod]]+1;
}
}
int main(){
FILE*fi,*fout;
int i,n,x,y;
fi=fopen("cerere.in" ,"r");
fout=fopen("cerere.out" ,"w");
fscanf(fi,"%d " ,&n);
for(i=1;i<=n;i++)
fscanf(fi,"%d " ,&k[i]);
for(i=1;i<n;i++){
fscanf(fi,"%d %d " ,&x,&y);
G[x].push_back(y);
father[y]=x;
}
i=1;
while(father[i]>0)
i++;
DFS1(i,0);
for(i=1;i<=n;i++)
if(father[i]==0||k[i]==0)
vf[i]=1;
for(i=1;i<=n;i++)
if(dp[i]==0)
DFS2(i);
for(i=1;i<=n;i++)
fprintf(fout,"%d " ,dp[i]);
fclose(fi);
fclose(fout);
return 0;
}