Cod sursa(job #3232071)

Utilizator rapidu36Victor Manz rapidu36 Data 28 mai 2024 19:32:08
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>
#include <vector>

using namespace std;

const int N = 1e5;

int urm[N+1], nr_m[N+1], n, drum[N+1];
vector <int> fii[N+1];
bool non_rad[N+1];

int radacina()
{
    for (int i = 1; i <= n; i++)
    {
        if (!non_rad[i])
        {
            return i;
        }
    }
    return 0;///doar pentru a evita un avertisment
}

void dfs(int x, int nivel)
{
    drum[nivel] = x;
    if (urm[x] == 0)
    {
        nr_m[x] = 0;
    }
    else
    {
        int stramos = drum[nivel - urm[x]];///stramosul caruia ii trimite x cererea
        nr_m[x] = 1 + nr_m[stramos];
    }
    for (auto y: fii[x])
    {
        dfs(y, nivel + 1);
    }
}

int main()
{
    ifstream in("cerere.in");
    ofstream out("cerere.out");
    in >> n;
    for (int i = 1; i <= n; i++)
    {
        in >> urm[i];
    }
    for (int i = 0; i < n - 1; i++)
    {
        int tata, fiu;
        in >> tata >> fiu;
        fii[tata].push_back(fiu);
        non_rad[fiu] = true;
    }
    dfs(radacina(), 0);
    for (int i = 1; i <= n; i++)
    {
        out << nr_m[i] << " ";
    }
    out << "\n";
    in.close();
    out.close();
    return 0;
}