Cod sursa(job #164599)

Utilizator alecmanAchim Ioan Alexandru alecman Data 24 martie 2008 16:01:24
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<stdio.h>

#define INPUT "cerere.in"
#define OUTPUT "cerere.out"
#define NMAX 100001

FILE *fin=fopen(INPUT, "r"),*fout=fopen(OUTPUT, "w");

typedef struct lista
{
  long nod;
  struct lista *next;
};

lista *p[ NMAX ];

long stramos[ NMAX ], final[ NMAX ], N, radacina, stiva[ NMAX ];

bool util[ NMAX ];

void readValues();

void solveFunction();

void DF();

void printSolution();

int main()
{
  readValues();

  solveFunction();

  fclose(fin);
  fclose(fout);

  return 0;
}

void readValues()
{
  lista *adr;

  long val1, val2;

  fscanf(fin, "%ld", &N);

  for(long i = 0; i < N; ++i)
    fscanf(fin, "%ld", &stramos[ i ]);

  for(long i = 0; i < N - 1; ++i)
  {
    fscanf(fin, "%ld %ld", &val1, &val2);

    adr = new lista;

    adr -> nod = val2 - 1;
    adr -> next = p[ val1 - 1 ];
    p[ val1 - 1 ] = adr;

    util[ val2 - 1 ] = 1;
  }
}

void solveFunction()
{
  radacina = -1;

  for(long i = 0; i < N; ++i)
    if(!util[ i ])
      radacina = i;

  DF();

  printSolution();
}

void DF()
{
  long pozitie, node, ancestor;

  stiva[ 0 ] = radacina;

  pozitie = 0;
  node = radacina;

  while(pozitie >= 0)
  {
    if(p[ node ] != NULL)
    {
      stiva[ ++pozitie ] = p[ node ] -> nod;

      ancestor = stramos[ stiva[ pozitie ]];

      if(ancestor)
	final[ stiva[ pozitie ] ] = final[ stiva[pozitie - ancestor]] + 1;

      else
	final[ stiva[ pozitie ] ] = 0;
  
      p[ node ] = p[ node ] -> next;

      node = stiva[ pozitie ];
    }
    else
    {
      --pozitie;
      node = stiva[ pozitie ];
    }
  }

}

void printSolution()
{
  for(long i = 0; i < N ; ++i)
    fprintf(fout, "%ld ", final[ i ]);

  fprintf(fout, "\n");
}