Cod sursa(job #2837255)

Utilizator LukyenDracea Lucian Lukyen Data 21 ianuarie 2022 23:54:51
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <bits/stdc++.h>

using namespace std;
const int l_vec = 100001;

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

int gradm[l_vec], visited[l_vec], parinte[l_vec], dist[30], sol[l_vec];
int nr_noduri;
vector<vector<int>> graf;

void dfs(int nod, int d);

int main()
{
    fin >> nr_noduri;
    graf.resize(nr_noduri + 1);
    for (int i = 1; i <= nr_noduri; i++)
        fin >> gradm[i];

    int p1, p2;
    while (fin >> p1 && fin >> p2)
        graf[p1].push_back(p2), parinte[p2] = p1;

    int root;
    for (int i = 1; i <= nr_noduri; i++)
        if (!parinte[i])
            root = i;

    dfs(root, 1);

    for (int i = 1; i <= nr_noduri; i++)
        fout << sol[i] << " ";

    return 0;
}

void dfs(int nod, int d)
{
    visited[nod] = 1;
    dist[d] = nod;

    if (gradm[nod] == 0)
        sol[nod] = 0;
    else
    {
        int dif = d - gradm[nod];
        sol[nod] = sol[dist[dif]] + 1;
    }

    for (auto next : graf[nod])
    {
        if (visited[next])
            continue;

        dfs(next, d + 1);
    }
}