Cod sursa(job #1256943)

Utilizator japjappedulapPotra Vlad japjappedulap Data 7 noiembrie 2014 00:31:53
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;

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

int N, v[100004], S[100004], D[100004], K, root;
vector <int> G[100004];
bitset <100004> B, HF;

void DFS(int t);

int main()
{
    is >> N;
    for (int i = 1; i <= N; ++i)
        is >> v[i];
    for (int i = 1, a, b; i < N; ++i)
    {
        is >> a >> b;
        G[a].push_back(b);
        HF[b] = 1;
    }
    for (int i = 1; i <= N; ++i)
        if (HF[i] == 0)
        {
            root = i;
            break;
        }

    DFS(root);
    for (int i = 1; i <= N; ++i)
        os << D[i] << ' ';
    is.close();
    os.close();
}

void DFS(int t)
{
    B[t] = 1;
    S[++K] = 0;
    for (const auto& f : G[t])
        if (B[f] == 0)
        {
            if (v[f] == 0)
                S[K] = 0;
            else
                S[K] = S[K-v[f]]+1;
            D[f] = S[K];
            DFS(f);
        }
    S[K] = 0;
    --K;
};