Pagini recente » Cod sursa (job #1441017) | Cod sursa (job #2512338) | Cod sursa (job #823585) | Cod sursa (job #1751473) | Cod sursa (job #95497)
Cod sursa(job #95497)
#include<stdio.h>
#define LS 100005
typedef struct NOD {int x; struct NOD* adr;};
FILE *fin,*fout;
int n,jump[LS],radacina,stiva[LS],niv,sol[LS],vizitat[LS];
NOD *prim[LS];
void adaug_st(NOD *(&prim), int inf)
{NOD *a=new NOD;
a->x=inf;
a->adr=prim;
prim=a;}
void citire()
{int i,u,v,e_radacina[LS],gasit=0;
fin=fopen("cerere.in","r");
fscanf(fin,"%d",&n);
for(i=1;i<=n;i++)
{fscanf(fin,"%d",&jump[i]);
e_radacina[i]=1;
prim[i]=NULL;}
for(i=0;i<n-1;i++)
{fscanf(fin,"%d %d",&u,&v);
e_radacina[v]=0;
adaug_st(prim[u],v);}
for(i=1;(i<=n)&&!gasit;i++)
if(e_radacina[i])
{gasit=1;
radacina=i;}
fclose(fin);}
void df(int varf)
{NOD *b=prim[varf];
stiva[niv]=varf;
//se calculeaza solutia pentru varful curent
int solutie=0,pozitie=niv;
while(jump[stiva[pozitie]])
{solutie++;
pozitie-=jump[stiva[pozitie]];}
sol[varf]=solutie;
while(b)
{if(!vizitat[b->x])
{vizitat[b->x]=1;
niv++;
df(b->x);
niv--;}
b=b->adr;}}
void scriere()
{fout=fopen("cerere.out","w");
for(int i=1;i<=n;i++)
fprintf(fout,"%d ",sol[i]);
fclose(fout);}
int main()
{
citire();
niv=0;
for(int i=1;i<=n;i++)
vizitat[i]=0;
vizitat[radacina]=1;
df(radacina);
scriere();
return 0;
}