Cod sursa(job #218320)

Utilizator k_ounu_eddyIacob Eduard k_ounu_eddy Data 1 noiembrie 2008 15:59:32
Problema Cerere Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include<stdio.h>
//#include<conio.h>

struct nod
{int info;
nod *urm;};

int main()
{//clrscr();
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;

for(i=1;i<=n;i++)
  {fscanf(pFile,"%d",&vector[i]);
  ListaFii[i]=new nod;
  ListaFii[i]->info=i;ListaFii[i]->urm=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;
//printf("radacina este %d\n",index);getch();

while(NoduriVizitate)
  {
  while(vizitat[radacina->info] && radacina)
    radacina=radacina->urm;
  if(radacina)
    {
    vizitat[radacina->info]=1;
    stiva[++nivel]=radacina->info;
    //printf("no=%d ni=%d ",stiva[nivel],nivel);
    if(vector[radacina->info])
      raspuns[radacina->info]=raspuns[stiva[nivel-vector[radacina->info]]]+1;
    else
      raspuns[radacina->info]=0;
    //printf("raspuns=%d\n",raspuns[radacina->info]);getch();
    radacina=ListaFii[radacina->info];
    NoduriVizitate--;}
  else
    {
    radacina=ListaFii[stiva[--nivel]];
    //printf("am urcat la %d ni=%d\n",stiva[nivel],nivel);
    //getch();
    }
  }
  
for(i=1;i<=n;i++)
  fprintf(pFileOut,"%d ",raspuns[i]);
  
delete predecesori;
delete ListaFii;
delete raspuns;
delete stiva;
delete vector;
delete vizitat;

fclose(pFile);
fclose(pFileOut);
return 0;
}