Cod sursa(job #14803)

Utilizator nemesisIchim Alexandru Eugen nemesis Data 9 februarie 2007 20:46:53
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
// INFOARENA CERERE 100pct


#include<stdio.h>
#include<stdlib.h>
#define maxn 100001
int n, rez[maxn], *a[maxn], x[maxn], pas[maxn], nr, pred[maxn];
bool viz[maxn];

void BFS(int k)
{
  viz[k]=1;
  if( !rez[k]) pas[k]=0;
  else pas[k]= 1+ pas[ x[nr-rez[k]]];
  
  for(int i=1; i<=a[k][0]; ++i) if( !viz[a[k][i]]) {
    x[++nr]= a[k][i];
    BFS( a[k][i]);
  }
  nr--;
}

int rad()
{
  int k=n;
  while(pred[k]) k= pred[k];
  return k;
}

int main()
{
  FILE *f=fopen("cerere.in","r");
  fscanf(f,"%d",&n);
  int i, x, y;
  for(i=0;i<=n+2;++i) {
    a[i]=(int*)malloc(sizeof(int));
    a[i][0]=0;
  }
  for(i=1; i<=n; ++i) fscanf(f,"%d",&rez[i]);
  for(i=1; i<=n-1; ++i) {
    fscanf(f,"%d %d",&x,&y);
    a[x][0]++;
    a[x]= (int*)realloc(a[x], sizeof(int)*a[x][0]+2);
    a[x][ a[x][0]]= y;

    pred[y]=x;
  }
  fclose(f);
  ///printf("%d ",rad());
  BFS( rad());
  FILE *g=fopen("cerere.out","w");
  for(i=1; i<=n; ++i) fprintf(g,"%d ",pas[i]);
  fprintf(g,"\n");



  return 0;
}