Cod sursa(job #1053246)

Utilizator Paula-ElenaPaula-Elena Margarit Paula-Elena Data 12 decembrie 2013 16:19:11
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream fin("cerere.in");
ofstream fout("cerere.out");

const int MAXN = 100011;

int N, v[MAXN], sol[MAXN], niv[MAXN], rad;
vector <int> G[MAXN], Gt[MAXN];
bool used[MAXN], am_tata[MAXN];

void citire()
{
    int fiu, tata;

    fin >> N;
    for (int i = 1; i <= N; ++i)
        fin >> v[i];
    for (int i = 1; i < N; ++i)
    {
        fin >> tata >> fiu;
        G[tata].push_back(fiu);
        am_tata[fiu] = true;
    }

    for (int i = 1; i <= N; ++i)
        if ( !am_tata[i] )
        {
            rad = i;
            break;
        }
}

inline void DFS(int nod, int nivel)
{
    used[nod] = true;
    niv[nivel] = nod;
    if ( v[nod] )
        sol[nod] = sol[niv[nivel - v[nod]]] + 1;

    for (int i = 0; i < G[nod].size(); ++i)
    {
        int tata = G[nod][i];
        if ( !used[tata] )
            DFS(tata, nivel+1);
     }
}

int main ()
{
    citire();

    niv[1] = 1;
    DFS(rad, 1);

    for (int i = 1; i <= N; ++i)
        fout << sol[i] << " ";

    fin.close();
    fout.close();

    return 0;
}