Cod sursa(job #1726249)

Utilizator preda.andreiPreda Andrei preda.andrei Data 7 iulie 2016 16:31:03
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

#define NMAX 100000

struct Nod
{
    int kstramos;
    int tata;
    vector<int> fii;
};

Nod noduri[NMAX + 1];
int distantaCerere[NMAX + 1];

void determinaDistante(int radacina);
int determinaKStramos(int nod);

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

    int n;
    fin >> n;

    for (int i = 1; i <= n; ++i)
        fin >> noduri[i].kstramos;

    for (int i = 1; i < n; ++i) {
        int x, y;
        fin >> x>> y;
        noduri[x].fii.push_back(y);
        noduri[y].tata = x;
    }

    int radacina = 0;
    for (int i = 1; i <= n && radacina == 0; ++i)
        if (noduri[i].tata == 0)
            radacina = i;

    determinaDistante(radacina);

    for (int i = 1; i <= n; ++i)
        fout << distantaCerere[i] << " ";

    return 0;
}

void determinaDistante(int radacina)
{
    queue<int> q;
    q.push(radacina);

    while (!q.empty()) {
        int nod = q.front();
        q.pop();

        if (noduri[nod].kstramos == 0) {
            distantaCerere[nod] = 0;
        }
        else {
            int stramos = determinaKStramos(nod);
            distantaCerere[nod] = distantaCerere[stramos] + 1;
        }

        for (int fiu : noduri[nod].fii)
            q.push(fiu);
    }
}

int determinaKStramos(int nod)
{
    int k = noduri[nod].kstramos;

    while (k--)
        nod = noduri[nod].tata;

    return nod;
}