Cod sursa(job #1744762)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 20 august 2016 14:03:28
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.78 kb
#include <cstdio>
#define MAXN 100000
int father[MAXN+1];
int k[MAXN+1];
int dp[MAXN+1];
char vf[MAXN+1];
int DFS(int nod){
   int i,x;
   if(vf[nod]==1)
      return dp[nod];
   else{
      x=nod;
      for(i=0;i<k[nod];i++)
        x=father[x];
      vf[nod]=1;
      return dp[nod]=DFS(x)+1;
   }
}
int main(){
   FILE*fi,*fout;
   int i,n,x,y;
   fi=fopen("cerere.in" ,"r");
   fout=fopen("cerere.out" ,"w");
   fscanf(fi,"%d " ,&n);
   for(i=1;i<=n;i++)
     fscanf(fi,"%d " ,&k[i]);
   for(i=1;i<n;i++){
       fscanf(fi,"%d %d " ,&x,&y);
       father[y]=x;
   }
   for(i=1;i<=n;i++)
     if(father[i]==0||k[i]==0)
       vf[i]=1;
   for(i=1;i<=n;i++)
     if(dp[i]==0)
       dp[i]=DFS(i);
   for(i=1;i<=n;i++)
     fprintf(fout,"%d " ,dp[i]);
   fclose(fi);
   fclose(fout);
   return 0;
}