Cod sursa(job #217475)

Utilizator k_ounu_eddyIacob Eduard k_ounu_eddy Data 28 octombrie 2008 18:54:26
Problema Cerere Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#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;
}