Cod sursa(job #95497)

Utilizator stef2nStefan Istrate stef2n Data 29 octombrie 2007 00:40:48
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<stdio.h>
#define LS 100005
typedef struct NOD {int x; struct NOD* adr;};
FILE *fin,*fout;
int n,jump[LS],radacina,stiva[LS],niv,sol[LS],vizitat[LS];
NOD *prim[LS];

void adaug_st(NOD *(&prim), int inf)
  {NOD *a=new NOD;
   a->x=inf;
   a->adr=prim;
   prim=a;}

void citire()
  {int i,u,v,e_radacina[LS],gasit=0;
   fin=fopen("cerere.in","r");
   fscanf(fin,"%d",&n);
   for(i=1;i<=n;i++)
      {fscanf(fin,"%d",&jump[i]);
       e_radacina[i]=1;
       prim[i]=NULL;}
   for(i=0;i<n-1;i++)
      {fscanf(fin,"%d %d",&u,&v);
       e_radacina[v]=0;
       adaug_st(prim[u],v);}
   for(i=1;(i<=n)&&!gasit;i++)
      if(e_radacina[i])
        {gasit=1;
         radacina=i;}
   fclose(fin);}

void df(int varf)
  {NOD *b=prim[varf];
   stiva[niv]=varf;
   //se calculeaza solutia pentru varful curent
   int solutie=0,pozitie=niv;
   while(jump[stiva[pozitie]])
        {solutie++;
         pozitie-=jump[stiva[pozitie]];}
   sol[varf]=solutie;
   while(b)
       {if(!vizitat[b->x])
          {vizitat[b->x]=1;
           niv++;
           df(b->x);
           niv--;}
        b=b->adr;}}

void scriere()
  {fout=fopen("cerere.out","w");
   for(int i=1;i<=n;i++)
      fprintf(fout,"%d ",sol[i]);
   fclose(fout);}


int main()
{
citire();
niv=0;
for(int i=1;i<=n;i++)
   vizitat[i]=0;
vizitat[radacina]=1;
df(radacina);
scriere();
return 0;
}