Cod sursa(job #1268659)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 21 noiembrie 2014 11:34:43
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <fstream>
#include <vector>
using namespace std;

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

int n;
vector<int> k, v, t, answ;
vector<vector<int> > g;

void READ();
void SOLVE(int nod);

int main()
{
    READ();
    for ( int i = 1; i <= n; ++i )
        if ( !t[i] )
        {
            SOLVE(i);
            break;
        }
    for ( int i = 1; i <= n; ++i )
        os << answ[i] << " ";
    is.close();
    os.close();
    return 0;
}

void SOLVE(int nod)
{
    v.push_back(nod);
    if ( v.size() != 1 && k[nod] )
        answ[nod] = answ[v[v.size() - 1 - k[nod]]] + 1;
    for ( size_t i = 0; i < g[nod].size(); ++i )
        SOLVE(g[nod][i]);
    v.pop_back();
}

void READ()
{
    int a, b;
    is >> n;
    k.resize(n + 1);
    g.resize(n + 1);
    t.resize(n + 1);
    answ.resize(n + 1);
    for ( int i = 1; i <= n; ++i )
        is >> k[i];
    for ( int i = 1; i < n; ++i )
    {
        is >> a >> b;
        t[b] = a;
        g[a].push_back(b);
    }
}