Cod sursa(job #2201327)

Utilizator cip_ionescuCiprian Ionescu cip_ionescu Data 4 mai 2018 11:45:45
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <iostream>
#include <fstream>

#define MAX_NM 100001

using namespace std;

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

int n, nr, vf[2 * MAX_NM], urm[2 * MAX_NM], lst[MAX_NM], v[MAX_NM], d[MAX_NM], a[MAX_NM], rez = MAX_NM, dv = 0;
bool viz[MAX_NM];

void adauga(int x, int y)
{
    nr++;
    vf[nr] = y;
    urm[nr] = lst[x];
    lst[x] = nr;
}

void dfs(int x)
{
    viz[x] = true;
    int p = lst[x], y, c, cnt = 0;
    d[++dv] = x;
    c = dv;

    if (v[x]) a[x] = a[d[dv - v[x]]] + 1;

    while (p != 0) {
        y = vf[p];
        if (!viz[y]) dfs(y);
        p = urm[p];
    }

    --dv;
}

int main()
{
    int x, y;
    fin >> n;
    for (int i = 1 ; i <= n ; i++) fin >> v[i];
    for (int i = 1 ; i < n ; i++) {
        fin >> x >> y;
        adauga(x, y);
    }
    for (int i = 1 ; i <= n ; i++) if (!viz[i]) dfs(i);
    for (int i = 1 ; i <= n ; i++) fout << a[i] << ' ';
    return 0;
}