Cod sursa(job #2322248)

Utilizator mihailescu_eduardMihailescu Eduard-Florin mihailescu_eduard Data 17 ianuarie 2019 16:45:51
Problema Cerere Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <fstream>
#include <vector>

using namespace std;

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

static const int NMAX = 1e5+5;

int n,root;
int v[NMAX],sol[NMAX];
bool viz[NMAX];
bool vizitat[NMAX];
vector<int> maimute[NMAX];
vector<int> stack;


void ReadInput()
{
    int i,x,y;
    fin >> n;
    for(i =1; i<=n ; ++i)
    {
        fin >> v[i];
    }
    for(i = 1; i < n; ++i)
    {
        fin >> x >> y;
        viz[y] = true;
        maimute[x].push_back(y);
    }
    for(i = 1; i< n; ++i)
    {
        if(viz[i] == false)
            root = i;
    }
}

void Solve(int k)
{
    stack.push_back(k);
    if(v[k])
    {
        sol[k] = 1 + sol[stack[stack.size()-1 - v[k]]];
    }
    else
        sol[k] = 0;
    
    for(int i = 0; i< maimute[k].size(); ++i)
    {
        if(!vizitat[maimute[k][i]])
            Solve(maimute[k][i]);
    }
    stack.pop_back();
}

int main()
{
    ReadInput();
    Solve(root);
    for(int i = 1; i<= n; ++i)
    {
        fout << sol[i] << " ";
    }

    return 0;
}