Cod sursa(job #308906)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 28 aprilie 2009 20:42:49
Problema Cerere Scor 100
Compilator cpp Status done
Runda tot Marime 1.05 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);  
}