Cod sursa(job #710576)

Utilizator psycho21rAbabab psycho21r Data 10 martie 2012 01:17:28
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int stack[100000], stack_size, back[100000], res[100000];
vector <int> tree[100000];
int pop()
{
    --stack_size;
    return stack[stack_size+1];
}
void push(int n)
{
    ++stack_size;
    stack[stack_size] = n;
}
void dfs(int node)
{
    if(back[node])
        res[node] = res[stack[stack_size-back[node]]] + 1;
    for(int i = 0; i < tree[node].size(); ++i)
    {
        push(tree[node][i]);
        dfs(tree[node][i]);
        pop();
    }
}
int main()
{
    int N;
    ifstream in("cerere.in");
    in >> N;
    for(int i = 0; i < N; ++i)
    {
        in >> back[i];
    }
    for(int i = 0, a, b; i < N-1; ++i)
    {
        in >> a >> b;
        tree[a-1].push_back(b-1);
        stack[b-1] = 1;
    }
    int root;
    for(int i = 0; i < N-1; ++i)
        if(!stack[i])
        {
            root = i;
            break;
        }
    push(root);
    dfs(0);
    ofstream out("cerere.out");
    for(int i = 0; i < N; ++i)
        out << res[i] << " ";
    out.close();
    return 0;
}