Cod sursa(job #2539658)

Utilizator CosminMorarMorar Cosmin Andrei CosminMorar Data 6 februarie 2020 09:34:07
Problema Cerere Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int n, rad;
vector<int> urm[100001];
int tt[100001], k[100001], sol[100001];
queue<int> c;

void readAndSet() {
    fin >> n;
    for (int i = 1; i <= n; i++)
        fin >> k[i];
    for (int i = 1; i <= n; i++) {
        int a, b;
        fin >> a >> b;
        urm[a].push_back(b);
        tt[b] = a;
    }
}

int findRoot() {
    for (int i = 1; i <= n; i++)
        if (!tt[i])
            return i;
}

int alKleaTata(int nod, int cate) {
    for (int i = 1; i <= cate; i++)
        nod = tt[nod];
    return nod;
}

void solve() {
    c.push(rad);

    while (!c.empty()) {
        int i = c.front();
        c.pop();

        if (k[i] == 0)
            sol[i] = 0;
        else
            sol[i] = sol[alKleaTata(i, k[i])] + 1;

        for (int j : urm[i])
            c.push(j);
    }
}

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

int main() {
    readAndSet();
    rad = findRoot();
    solve();
    print();
    return 0;
}