Cod sursa(job #297625)

Utilizator katamashCatalin Tamas katamash Data 5 aprilie 2009 15:07:27
Problema Cerere Scor 100
Compilator cpp Status done
Runda preONI Marime 1.1 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 df(int);   
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;   
    q[b]=1;   
  }   
  for(i=1;i<=n;i++)if(!q[i]){   
      df(i);   
      return;}   
}   
  
void df(int rad){   
  int p=1,x,y;   
  q[1]=rad;   
  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();   
  for(i=1;i<=n;i++)fprintf(g,"%d ",rez[i]);   
  fclose(f);   
  fclose(g);   
}