Pagini recente » Cod sursa (job #1070028) | Cod sursa (job #2828855) | Cod sursa (job #375063) | Cod sursa (job #2645858) | Cod sursa (job #218259)
Cod sursa(job #218259)
#include<stdio.h>
#define LUNGIME 100005
struct nod
{int info;
nod *urm;};
int main()
{
FILE *pFile=fopen("cerere.in","r");
FILE *pFileOut=fopen("cerere.out","w");
int n,i,fiu,parinte,nivel=1,NoduriVizitate,index=0;
nod *radacina;
fscanf(pFile,"%d",&n);
bool predecesori[LUNGIME];
nod *ListaFii[LUNGIME];
int vector[LUNGIME];
int stiva[LUNGIME];
int raspuns[LUNGIME];
bool vizitat[LUNGIME];
NoduriVizitate=n-1;
for(i=1;i<=n;i++)
{fscanf(pFile,"%d",&vector[i]);
ListaFii[i]=NULL;vizitat[i]=false;predecesori[i]=false;}
for(i=1;i<=n-1;i++)
{fscanf(pFile,"%d %d",&parinte,&fiu);
predecesori[fiu]=true;
if(ListaFii[parinte]==NULL)
{
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;
}
}
for(i=1;i<=n && !index;i++)
if(predecesori[i]==false)
index=i;
radacina=ListaFii[index];
raspuns[index]=0;
stiva[1]=index;
while(NoduriVizitate)
{
while(vizitat[stiva[index]] && radacina)
stiva[index]=radacina->urm->info;
if(radacina)
{
vizitat[radacina->info]=true;
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++)
fprintf(pFileOut,"%d ",raspuns[i]);
fclose(pFile);
fclose(pFileOut);
return 0;
}