Pagini recente » Cod sursa (job #3177068) | Cod sursa (job #1219628) | Cod sursa (job #2744576) | Cod sursa (job #1570763) | Cod sursa (job #218021)
Cod sursa(job #218021)
#include<stdio.h>
struct nod
{int info;
nod *urm;};
int main()
{FILE *pFile=fopen("cerere.in","r");
FILE *pFileOut=fopen("cerere.out","w");
int n,*vector,i,fiu,parinte,nivel=1,*stiva,*raspuns,NoduriVizitate,index;
nod **ListaFii,*radacina;
bool *vizitat,*predecesori;
fscanf(pFile,"%d",&n);
predecesori=new bool[n+1];
ListaFii=new nod*[n+1];
vector=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]);
ListaFii[i]=0;vizitat[i]=0;predecesori[i]=0;}
for(i=1;i<=n-1;i++)
{fscanf(pFile,"%d %d",&parinte,&fiu);
predecesori[fiu]=1;
if(!ListaFii[parinte])
{
nod *aux=new nod;
aux->urm=0;
aux->info=fiu;
ListaFii[parinte]=aux;
}
else
{
nod *aux=new nod;
aux->urm=0;
aux->info=fiu;
nod *aux2;
aux2=ListaFii[parinte];
while(aux2->urm)
aux2=aux2->urm;
aux2->urm=aux;
}
}
bool gasit=0;
for(i=1;i<=n && !gasit;i++)
if(predecesori[i]==0)
{index=i;gasit=1;}
radacina=ListaFii[index];
raspuns[index]=0;
stiva[1]=index;
while(NoduriVizitate)
{
while(vizitat[radacina->info] && radacina)
radacina=radacina->urm;
if(radacina)
{
vizitat[radacina->info]=1;
stiva[++nivel]=radacina->info;
if(vector[radacina->info])
raspuns[radacina->info]=raspuns[stiva[nivel-vector[radacina->info]]]+1;
else
raspuns[radacina->info]=0;
radacina=ListaFii[radacina->info];
NoduriVizitate--;}
else radacina=ListaFii[stiva[--nivel]];
}
for(i=1;i<=n;i++)
{delete ListaFii[i];
fprintf(pFileOut,"%d ",raspuns[i]);}
delete predecesori;
delete ListaFii;
delete raspuns;
delete stiva;
delete vector;
delete vizitat;
fclose(pFile);
fclose(pFileOut);
return 0;
}