Pagini recente » Cod sursa (job #139208) | Cod sursa (job #1062444) | Cod sursa (job #283272) | Cod sursa (job #48574) | Cod sursa (job #271561)
Cod sursa(job #271561)
#include<stdio.h>
FILE*f=fopen("cerere.in","r");
FILE*g=fopen("cerere.out","w");
int K[100003];
int n,m;
int st[100003];
int viz[100003];
int sol[100003],p;
int R, tata[100003];
struct Nod
{
int vf;
Nod *urm;
};
Nod *G[100003];
void insert(int x, int y)
{
Nod *q;
q=new Nod;
q->vf = y;
q->urm=G[x];
G[x]=q;
}
void read()
{
fscanf(f,"%d",&n);
int i;
for(i=1;i<=n;++i) fscanf(f,"%d",&K[i]);
for(i=1;i<n;++i)
{
int a,b;
fscanf(f,"%d%d",&a,&b);
tata[b] = a; // muchie de la a la b
insert(a,b);
}
for(i=1;i<=n;++i) if(!tata[i]) { R=i; break; }
}
void DF()
{
int ok,vf=0, nod;
Nod *q;
st[++vf] = R;
viz[R] = 1;
while(vf)
{
nod = st[vf];
ok=0;
for(q=G[nod];q;q=q->urm)
{
if(!viz[q->vf])
{
viz[q->vf] = 1;
st[++vf] = q->vf;
if(K[q->vf]) sol[q->vf] = sol[st[vf - K[q->vf]]] + 1;
ok=1;
break;
}
}
if(ok==1);
else --vf;
}
for(int i=1;i<=n;++i) fprintf(g,"%d ",sol[i]);
}
int main()
{
read();
DF();
return 0;
}