Cod sursa(job #1675955)

Utilizator mihai.constantinConstantin Mihai mihai.constantin Data 5 aprilie 2016 17:33:43
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int N_max = 100002;

int lst[N_max];
int vf[N_max];
int urm[N_max];
int nr;

int v[N_max];

bool viz[N_max];
int grad[N_max];

int st[N_max];
int lev;
int sol[N_max];

int N;

void adauga(int x, int y)
{
    /* ADAUGA IN LISTA LUI x PE y */

    nr++;
    vf[nr] = y;
    urm[nr] = lst[x];
    lst[x] = nr;
}

void dfs(int x)
{
    int p, y;

    viz[x] = true;

    st[++lev] = x;

    sol[x] = sol[ st[lev - v[x]] ] + 1;
    if(!v[x]) sol[x] = 0;

    /* PARCURG VECINII y AI LUI x */

    p = lst[x];

    while(p != 0)
    {
        y = vf[p];

        if(!viz[y]) dfs(y);

        p = urm[p];
    }

    st[lev--] = 0;
}

void solve()
{
    int i, x, y, radacina;

    in >> N;

    for(i = 1; i <= N; i++) in >> v[i];

    for(i = 1; i < N; i++)
    {
        in >> x >> y;
        adauga(x, y);

        grad[y]++;
    }

    for(i = 1; i <= N; i++)
        if(!grad[i]) radacina = i;

    dfs(radacina);

    for(i = 1; i <= N; i++) out << sol[i] << " ";
}

int main()
{
    solve();

    return 0;
}