Cod sursa(job #1744766)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 20 august 2016 14:14:48
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <cstdio>
#include <vector>
using namespace std;
#define MAXN 100000
vector <int> G[MAXN+1];
int father[MAXN+1];
int k[MAXN+1];
int dp[MAXN+1];
int v[MAXN+1];
int stiv[MAXN+1];
char vf[MAXN+1];
void DFS1(int nod,int n){
    int i;
    stiv[n]=nod;
    if(father[nod]>0)
      v[nod]=stiv[n-k[nod]];
    for(i=0;i<G[nod].size();i++)
        DFS1(G[nod][i],n+1);
}
void DFS2(int nod){
   int i,x;
   if(vf[nod]==0){
      DFS2(v[nod]);
      vf[nod]=1;
      dp[nod]=dp[v[nod]]+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);
       G[x].push_back(y);
       father[y]=x;
   }
   i=1;
   while(father[i]>0)
     i++;
   DFS1(i,0);
   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)
       DFS2(i);
   for(i=1;i<=n;i++)
     fprintf(fout,"%d " ,dp[i]);
   fclose(fi);
   fclose(fout);
   return 0;
}