Cod sursa(job #218259)

Utilizator k_ounu_eddyIacob Eduard k_ounu_eddy Data 1 noiembrie 2008 12:27:44
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#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;
}