Cod sursa(job #2311797)

Utilizator DariusDCDarius Capolna DariusDC Data 3 ianuarie 2019 18:19:39
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <iostream>
#include <fstream>
#include <vector>
#define nmax 100001

using namespace std;

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

int n;
int K[nmax];
int solutie[nmax];
vector <int> Graf[nmax];
bool viz[nmax];
int root;
bool vizitat[nmax];
vector <int> stack;

void read()
{
  fin >> n;
  for (int i=1;i<=n;i++)
    fin >> K[i];
  for (int i=1;i<n;i++)
  {
    int x, y;
    fin >> x >> y;
    viz[y] = true;
    Graf[x].push_back(y);
  }
  for (int i = 1; i <= n; i++)
    if (viz[i] == false)
      {
        root = i;
        return;
      }
}

void dfs(int nod)
{
    stack.push_back(nod);
    vizitat[nod] = true;
    if (K[nod])
      solutie[nod] = 1 + solutie[stack[(stack.size() -1 - K[nod])]];
    else solutie[nod] = 0;
    for (unsigned int i = 0; i < Graf[nod].size(); i++)
    {
      int vecin = Graf[nod][i];
      if (!vizitat[vecin])
        dfs(vecin);
    }
    stack.pop_back();
}

void rezolva()
{
  read();
  dfs(root);
  for (int i = 1; i <= n; i++)
    fout << solutie[i] << " ";
}

int main()
{
  rezolva();
  return 0;
}