Cod sursa(job #2511173)

Utilizator StanCatalinStanCatalin StanCatalin Data 18 decembrie 2019 14:33:55
Problema Cerere Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int dim = 100005;

int vf[2*dim],urm[2*dim],lst[dim],nr,n,v[dim],stramos[dim],maxi,cerere[dim];
vector<int> vc;
vector<int> vi[dim];

void Adauga(int x,int y)
{
    vf[++nr] = y;
    urm[nr] = lst[x];
    lst[x] = nr;
}

void DFS(int nod,int parent,int adancime)
{
    vi[adancime].push_back(nod);
    maxi = max(maxi , adancime);
    vc.push_back(nod);
    stramos[nod] = vc.at( vc.size() - v[nod] - 1);

    for (int p = lst[nod]; p!=0; p = urm[p])
    {
        int y = vf[p];
        if (y != parent) DFS(y, nod, adancime+1);
    }
    vc.pop_back();
}

int main()
{
    in >> n;
    for (int i=1; i<=n; i++) in >> v[i];
    for (int i=1,x,y; i<=n-1; i++)
    {
       in >> x >> y;
       Adauga(x,y);
       Adauga(y,x);
    }
    DFS(1,0,0);

    for (int i=1; i<=maxi; i++)
    {
        for (auto vec:vi[i])
        {
            if (stramos[vec] == vec) cerere[vec] = 0;
            else cerere[vec] = 1 + cerere[stramos[vec]];
        }
    }
    for (int i=1; i<=n; i++) out << cerere[i] << " ";
    return 0;
}