Cod sursa(job #2052020)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 29 octombrie 2017 21:06:56
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <cstdio>
#include <vector>

const int MAX_N = 100000;

int K[MAX_N];
std::vector<int> G[MAX_N];
bool isSon[MAX_N];
int sol[MAX_N];

void dfs(int node, int t[MAX_N], int tSize) {
  t[++tSize] = node;
  for (auto u : G[node]) {
    if (K[u] == 0) {
      sol[u] = 0;
    } else {
      sol[u] = 1 + sol[t[tSize - K[u] + 1]];
    }
    dfs(u, t, tSize);
  }
}

int main() {
  freopen("cerere.in", "r", stdin);
  freopen("cerere.out", "w", stdout);

  int N;
  scanf("%d", &N);
  for (int i = 0; i < N; i++) {
    scanf("%d", &K[i]);
  }
  for (int i = 0; i < N - 1; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    x--;
    y--;
    G[x].push_back(y);
    isSon[y] = true;
  }
  int rad = 0;
  for (int node = 0; node < N; node++) {
    if (!isSon[node]) {
      rad = node;
      break;
    }
  }
  sol[rad] = 0;
  int t[MAX_N];
  dfs(rad, t, -1);
  for (int i = 0; i < N; i++) {
    printf("%d ", sol[i]);
  }
  printf("\n");
  return 0;
}