Cod sursa(job #295754)

Utilizator drag0shSandulescu Dragos drag0sh Data 3 aprilie 2009 17:32:40
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.81 kb
#include <stdio.h>
#include <stdlib.h>

FILE *f=fopen("cerere.in","r"),*g=fopen("cerere.out","w");

int v[100001],n,*gr[100001],q[100001],who[100001],rez[100001];

void citire(){
  int i,a,b;
  fscanf(f,"%d",&n);
  for(i=1;i<=n;i++){
    fscanf(f,"%d",&v[i]);
    gr[i]=(int*)realloc(gr[i],sizeof(int));
    gr[i][0]=0;
    who[i]=1;
  }
  for(i=0;i<n;++i){
    fscanf(f,"%d%d",&a,&b);
    gr[a][0]++;
    gr[a]=(int*)realloc(gr[a],sizeof(int)*(gr[a][0]+1));
    gr[a][gr[a][0]]=b;  
  }
}

void df(){
  int p=1,x,y;
  q[1]=1;
  while(p>0){
    x=q[p];
    if(who[x]<=gr[x][0]){
      
      q[++p]=gr[x][who[x]];
      who[x]++;
      y=q[p];
      if(v[y])rez[y]=rez[q[p-v[y]]]+1;
    }
    else
      p--;
  }
  
}


int main(){
  int i;
  citire();
  df();
  for(i=1;i<=n;i++)fprintf(g,"%d ",rez[i]);
  fclose(f);
  fclose(g);
}