Pagini recente » Cod sursa (job #2441473) | Cod sursa (job #1198291) | Cod sursa (job #1904325) | Cod sursa (job #684241) | Cod sursa (job #1341167)
#include<cstdio>
#include<vector>
using namespace std;
vector<int>v[100001];
bool vc[100001];
int a,b,n;
int coada[100001];
int vec[100001],tata[100001],rez[100001];
void bfs(int nod){
int ic,sf;
ic=1;
sf=1;
coada[1]=nod;
while(ic<=sf){
for(int i=0;i<v[coada[ic]].size();i++){
sf++;
coada[sf]=v[coada[ic]][i];
tata[v[coada[ic]][i]]=coada[ic];
}
ic++;
}
}
int main(){
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&vec[i]);
for(int i=1;i<=n-1;i++){
scanf("%d%d",&a,&b);
v[a].push_back(b);
vc[b]=true;
}
for(int i=1;i<=n;i++)
if(vc[i]==false)
bfs(i);
int maim, mmaim,rezu,pp;
for(int i=1;i<=n;i++)
rez[i]=-1;
for(int i=1;i<=n;i++){
maim=coada[i];
mmaim=maim;
rezu=0;
pp=0;
while(vec[mmaim]!=0&&pp==0){
if(rez[mmaim]!=-1){
rezu+=rez[mmaim];
mmaim=tata[mmaim];
pp=1;
}
else{
rezu++;
int cv=vec[mmaim];
while(cv){
mmaim=tata[mmaim];
cv--;
}
}
}
rez[maim]=rezu;
}
for(int i=1;i<=n;i++)
printf("%d ",rez[i]);
return 0;
}