Cod sursa(job #782489)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 28 august 2012 01:30:52
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <fstream>
#include <vector>

#define MAX 131072

using namespace std;

int k[MAX], grad[MAX], ancestor[MAX], stack[MAX], n, a, b;
vector<int> v[MAX];

inline int getRoot()
{
    for(int i = 1; i <= n; i++)
        if(!grad[i]) return i;
}

void dfs(int nod)
{
    stack[++stack[0]] = nod;
    ancestor[nod] = stack[stack[0] - k[nod]];
    for(int i = 0; i < v[nod].size(); i++)
        dfs(v[nod][i]);
    stack[0]--;
}

int main()
{
    ifstream in("cerere.in");
    in>>n;
    for(int i = 1; i <= n; i++) in>>k[i];
    for(int i = 1; i < n; i++)
    {
        in>>a>>b; grad[b]++;
        v[a].push_back(b);
    } in.close();
    dfs(getRoot());
    ofstream out("cerere.out");
    for(int i = 1; i <= n; i++)
    {
        int result = 0, nod = i;
        while(ancestor[nod] != nod) nod = ancestor[nod], result++;
        out<<result<<" ";
    }
    out.close();
    return 0;
}