Cod sursa(job #2313420)

Utilizator alexsandulescuSandulescu Alexandru alexsandulescu Data 6 ianuarie 2019 20:55:51
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.78 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("cerere.in");
ofstream g("cerere.out");

int N, x, y, K[100003], lv[100003], tati[100003];
bool sel[100003];
vector<int> G[100003];

void df(int nod, int niv);

int main() {

    f >> N;
    for (int i = 1; i <= N; i++) f >> K[i];
    for (int i = 1; i < N; i++)
        f >> x >> y, G[x].push_back(y), sel[y] = true;

    int root = 0;
    for (int i = 1; i <= N; i++)
        if (!sel[i]) {  root = i; break;  }
    for (int i = 1; i <= N; i++) sel[i] = false;

    df(root, 1);
    for (int i = 1; i <= N; i++) g << tati[i] << " ";
    return 0;
}

void df(int nod, int niv) {
    sel[nod] = true, lv[niv] = nod;
    if (K[nod]) tati[nod] = tati[lv[niv - K[nod]]] + 1;
    for (auto i : G[nod])
        if (!sel[i]) df(i, niv + 1);
}