Pagini recente » Cod sursa (job #637900) | Cod sursa (job #2080199) | Cod sursa (job #1802130) | Cod sursa (job #643073) | Cod sursa (job #197120)
Cod sursa(job #197120)
#include<stdio.h>
#define N 100005
int n,k[N],co[N],st[N],nr,strm[N],sol[N];
bool viz[N],cafiu[N];
struct graf
{
int nod;
graf *next;
};
graf *a[N];
void adauga(int tata,int fiu)
{
graf *g=new graf;
g->nod=fiu;
g->next=a[tata];
a[tata]=g;
}
void citeste()
{
int i,tata,fiu;
scanf("%d",&n);
for(i=1; i<=n; i++)
scanf("%d",&k[i]);
for(i=1; i<n; i++)
{
scanf("%d%d",&tata,&fiu);
adauga(tata,fiu);
cafiu[fiu]=true;
}
}
void dfs(int x)
{
viz[x]=true;
st[++nr]=x;
strm[x]=st[nr-k[x]];
graf *g;
g=a[x];
while(g)
{
if(!viz[g->nod])
dfs(g->nod);
g=g->next;
}
nr--;
}
void bfs(int x)
{
int inc=0,sf=0,acu;
co[0]=x;
viz[x]=false;
graf *g;
while(inc<=sf)
{
acu=co[inc++];
g=a[acu];
while(g)
{
if(viz[g->nod])
{
co[++sf]=g->nod;
viz[g->nod]=false;
}
g=g->next;
}
}
}
void rezolva()
{
int i,parinte=0;
for(i=1; (i<=n)&&(parinte==0); i++)
{
if(cafiu[i]==false)
parinte=i;
}
dfs(parinte);
bfs(parinte);
for(i=0; i<n; i++)
{
if(k[co[i]]==0)
sol[co[i]]=0;
else
sol[co[i]]=sol[strm[co[i]]]+1;
}
}
void scrie()
{
int i;
for(i=1; i<n; i++)
printf("%d ",sol[i]);
printf("%d\n",sol[n]);
}
int main()
{
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
citeste();
rezolva();
scrie();
return 0;
}