Cod sursa(job #2476174)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 18 octombrie 2019 11:23:14
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int N=100005;
int k[N];
bool tata[N];
vector<int> gr[N];
int dp[N];
int vf=0;
int stv[N];
int stramos(int nod,int k){
  return stv[vf-k];
}
void dfs(int nod,int tata){
  stv[++vf]=nod;
  if(k[nod]==0)
    dp[nod]=0;
  else{
    int strm=stramos(nod,k[nod]);
    dp[nod]=1+dp[strm];
  }
  for(auto x:gr[nod]){
    if(x!=tata){
      dfs(x,nod);
    }
  }
  vf--;
}
int main()
{
  FILE*fin,*fout;
  fin=fopen("cerere.in","r");
  fout=fopen("cerere.out","w");
  int n;
  fscanf(fin,"%d",&n);
  for(int i=1;i<=n;i++){
    fscanf(fin,"%d",&k[i]);
  }
  for(int i=1;i<n;i++){
    int x,y;
    fscanf(fin,"%d%d",&x,&y);
    tata[y]=true;
    gr[x].push_back(y);
  }
  for(int i=1;i<=n;i++){
    if(tata[i]==0){
      dfs(i,0);
      break;
    }
  }
  for(int i=1;i<=n;i++){
    fprintf(fout,"%d ",dp[i]);
  }
  return 0;
}