Pagini recente » Cod sursa (job #4188) | Cod sursa (job #2655119) | Cod sursa (job #2572387) | Cod sursa (job #3032944) | Cod sursa (job #217475)
Cod sursa(job #217475)
#include<stdio.h>
int main()
{
FILE *pFile=fopen("cerere.in","r");
FILE *pFileOut=fopen("cerere.out","w");
int n,*vector,*tata,i,fiu,parinte,nivel=1,*stiva,radacina,NoduriVizitate,*raspuns;
bool *vizitat;
fscanf(pFile,"%d",&n);
vector=new int[n+1];
tata=new int[n+1];
stiva=new int[n+1];
raspuns=new int[n+1];
vizitat=new bool[n+1];
NoduriVizitate=n-1;
for(i=1;i<=n;i++)
{fscanf(pFile,"%d",&vector[i]);
tata[i]=0;vizitat[i]=0;}
for(i=1;i<=n-1;i++)
{fscanf(pFile,"%d %d",&parinte,&fiu);
tata[fiu]=parinte;}
bool gasit=0;
for(i=1;i<=n && !gasit;i++)
if(tata[i]==0)
{radacina=i;
gasit=1;}
stiva[nivel]=radacina;
vizitat[radacina]=1;
raspuns[radacina]=0;
while(NoduriVizitate)
{gasit=0;
for(i=1;i<=n && gasit==0;i++)
if(tata[i]==stiva[nivel] && !vizitat[i])
{stiva[++nivel]=i;gasit=1;NoduriVizitate--;vizitat[i]=1;
if(vector[i]!=0)
raspuns[i]=raspuns[stiva[nivel-vector[i]]]+1;
else
raspuns[i]=0;
}
if(!gasit)
nivel--;
}
for(i=1;i<=n;i++)
fprintf(pFileOut,"%d ",raspuns[i]);
delete raspuns;
delete stiva;
delete tata;
delete vector;
delete vizitat;
fclose(pFile);
fclose(pFileOut);
return 0;
}