Cod sursa(job #1053223)

Utilizator alexclpAlexandru Clapa alexclp Data 12 decembrie 2013 15:47:26
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int N = 100005;

int rang[N];
int s[N];
int rasp[N];

bool son[N];
bool viz[N];

int n;
int niv;

vector <int> a[N];

void read()
{
    in >> n;

    for (int i = 1; i <= n; i++) {
        in >> rang[i];
    }

    for (int i = 1; i < n; i++) {
        int x, y;
        in >> x >> y;

        son[y] = true;

        a[x].push_back(y);
    }
}

void print (int x[])
{
    for (int i = 1; i <= niv; i++) {
        out << x[i] << " ";
    }
    out << "\n";
}

void dfs(int x)
{
    viz[x] = true;

    s[++niv] = x;
    if (rang[x] != 0) {
        rasp[x] = 1 + rasp[s[niv - rang[x]]];
    }

    //out << "nod = " << x << "\n";
    //print (s);


    for (int i = 0; i < a[x].size(); i++) {
        int y = a[x][i];

        if (!viz[y]) {
            dfs(y);
        }
    }
    niv --;
}

int main()
{
    read();

    int rad;

    for (int i = 1; i <= n; i++) {
        if (!son[i]) {
            rad = i;
        }
    }

    dfs(rad);

    for (int i = 1; i <= n; i++) {
        out << rasp[i] << " ";
    }

    out << "\n";

    return 0;
}