Cod sursa(job #990346)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 27 august 2013 23:44:59
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

#define Nmax 100005

vector <int> G[Nmax];

int wise[Nmax];
int answer[Nmax];
int degree[Nmax];
int use[Nmax];
int stiva[Nmax];

int N, R, vf;

void read()
{
    ifstream f("cerere.in");

    f >> N;

    for ( int i = 1; i <= N; ++i )
            f >> wise[i];

    for ( int i = 1; i < N; ++i )
    {
        int a, b;

        f >> a >> b;

        G[a].push_back( b );

        degree[b]++;
    }

    f.close();
}

void init()
{
    for ( int i = 1; i <= N; ++i )
            if ( degree[i] == 0 )
                    R = i;
}

void DFS( int nod )
{
    stiva[ vf = 1 ] = nod;

    while( vf )
    {
        int nod = stiva[vf];

        if ( use[nod] == (int)G[nod].size() )
                vf--;
        else
        {
            int son = G[nod][ use[nod]++ ];

            stiva[ ++vf ] = son;

            if ( wise[son] )
                    answer[son] = answer[ stiva[ vf - wise[son] ] ] + 1;
        }
    }
}

void print()
{
    ofstream g("cerere.out");

    for ( int i = 1; i <= N; ++i )
            g << answer[i] << " ";

    g << "\n";

    g.close();
}

int main()
{
    read();
    init();
    DFS( R );
    print();

    return 0;
}