Cod sursa(job #2646984)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 2 septembrie 2020 16:31:21
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <fstream>
#include <vector>

using namespace std;

const int NMAX = 100000;

int k[1 + NMAX];
bool parinte[1 + NMAX];
vector<int> graf[1 + NMAX];

int stiva[1 + NMAX];
int top = 0;
int sol[1 + NMAX];

void dfs(int nod)
{
  top++;
  stiva[top] = nod;

  if (k[nod] != 0)
  {
    sol[nod] = sol[stiva[top - k[nod]]] + 1;
  }

  for (int i = 0; i < graf[nod].size(); i++)
  {
    int fiu = graf[nod][i];
    dfs(fiu);
  }

  top--;
}

int main()
{
  ifstream in("cerere.in");
  ofstream out("cerere.out");

  int n;
  in >> n;
  for (int i = 1; i <= n; i++)
  {
    in >> k[i];
  }
  for (int i = 1; i <= n - 1; i++)
  {
    int a, b;
    in >> a >> b;
    parinte[b] = true;
    graf[a].push_back(b);
  }

  for (int i = 1; i <= n; i++)
  {
    if (!parinte[i])
    {
      dfs(i);
      break;
    }
  }

  for (int i = 1; i <= n; i++)
  {
    out << sol[i] << ' ';
  }

  return 0;
}