Cod sursa(job #218445)

Utilizator k_ounu_eddyIacob Eduard k_ounu_eddy Data 1 noiembrie 2008 22:47:51
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<stdio.h>
//#include<conio.h>

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

int n,*vector,i,fiu,parinte,nivel=0,*raspuns,NoduriVizitate,index,*stiva;
nod **ListaFii,*radacina;
bool *vizitat,*predecesori;


void df_r1(int NodCurent)
{
stiva[++nivel]=NodCurent;
if(vector[NodCurent])
  raspuns[NodCurent]=raspuns[stiva[nivel-vector[NodCurent]]]+1;
else
  raspuns[NodCurent]=0;
//printf("%d ni=%d\n",NodCurent,nivel);getch();
nod *p;
p=ListaFii[NodCurent];
vizitat[NodCurent]=1;
while(p)
  {
  if(!vizitat[p->info])
    df_r1(p->info);
  nivel--;
  p=p->urm;
  }
}

int main()
{//clrscr();
FILE *pFile=fopen("cerere.in","r");
FILE *pFileOut=fopen("cerere.out","w");
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]=0;vizitat[i]=0;predecesori[i]=0;}
  
for(i=1;i<=n-1;i++)
  {
  fscanf(pFile,"%d %d",&parinte,&fiu);
  predecesori[fiu]=1;
  nod *aux=new nod;
  aux->urm=ListaFii[parinte];
  aux->info=fiu;
  ListaFii[parinte]=aux;
  }
bool gasit=0;

for(i=1;i<=n && !gasit;i++)
  if(predecesori[i]==0)
    {index=i;gasit=1;}
  
//printf("radacina este %d\n",index);getch();

df_r1(index);

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;
}