Cod sursa(job #1191961)

Utilizator pop_bogdanBogdan Pop pop_bogdan Data 28 mai 2014 19:50:37
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <vector>
using namespace std;

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

int N, x, y;
vector <int> V;
vector <vector<int> > G;
int Stack[100001];
int R[100001];
bool Vis[100001];

void Input();
void DF();
void Output();

int main()
{
    Input();
    DF();
    Output();

    is.close();
    os.close();
}

void Input()
{
    is >> N;
    G.resize(N+1);
    V.push_back(0);
    for ( int i = 1; i <= N; ++i )
    {
        is >> x;
        V.push_back(x);
    }
    for ( int i = 1; i <= N-1; ++i )
    {
        is >> x >> y;
        G[x].push_back(y);
    }
}

void DF()
{
    int it(1);

    Stack[it] = 1;
    Vis[it] = true;

    while ( it )
    {
        x = Stack[it];
        if ( V[x] )
            R[x] = 1 + R[Stack[it-V[x]]];
        y = -1;
        for ( int i = 0; i < G[x].size() ; ++i )
        {
            if ( Vis[G[x][i]] == false )
            {
                y = 1;
                Stack[++it] = G[x][i];
                Vis[G[x][i]] = true;
                i = G[x].size();
            }
        }
        if ( y == -1 )
            it--;
    }
}

void Output()
{
    for ( int i = 1; i <= N; ++i )
        os << R[i] << " ";
}