Cod sursa(job #1195311)

Utilizator apopeid15Apopei Daniel apopeid15 Data 6 iunie 2014 20:50:28
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
#include <vector>
using namespace std;

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

int N, x, y;
int V[100001];
vector <int> G[100001];
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;
    for ( int i = 1; i <= N; ++i )
    {
        is >> x;
        V[i] = x;
    }
    for ( int i = 1; i <= N-1; ++i )
    {
        is >> x >> y;
        Vis[y] = true;
        G[x].push_back(y);
    }
}

void DF()
{
    int it(1);
    for ( int i = 1; i <= N; ++i )
    {
        if ( Vis[i] == false )
        {
            Stack[it] = i;
            Vis[i] = true;
        }
        else
            Vis[i] = false;

    }

    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; it++;
                Stack[it] = G[x][i];
                Vis[G[x][i]] = true;
                i = 10000000000;
            }
        }
        if ( y == -1 )
            it--;
    }
}

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