Cod sursa(job #3141425)

Utilizator NanuGrancea Alexandru Nanu Data 13 iulie 2023 22:42:33
Problema Cerere Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream fin("cerere.in");
ofstream fout("cerere.out");

//dfs iar la fiecare pas retin intr un vector nodurile care fac parte din lantul actual
//iar pentru fiecare nod retin prin cate maimute trec;

#define DIM 100000

int n;
bool viz[DIM + 5];
int dp[DIM + 5], v[DIM + 5];
vector <int> G[DIM + 5], aux;

static inline void dfs(int nod) {
  viz[nod] = 1;
  aux.push_back(nod);      //face parte din lantul actual;
  dp[nod] = (v[nod] == 0 ? 0 : dp[aux[aux.size() - 1 - v[nod]]] + 1);
  for(auto e : G[nod])
    if(!viz[e])
      dfs(e);
  
  aux.pop_back();
}

int main() {
  fin >> n;

  for(int i = 1; i <= n; i++) 
    fin >> v[i];
  

  int root = n * (n + 1) / 2;
  for(int i = 1, x, y; i < n; i++) {
    fin >> x >> y;
    G[x].push_back(y);
    G[y].push_back(x);
    root -= y;
  }

  dfs(root);

  for(int i = 1; i <= n; i++)
    fout << dp[i] << " ";

  return 0;
}