Cod sursa(job #1053683)

Utilizator GaborGabrielFMI - GabrielG GaborGabriel Data 12 decembrie 2013 21:41:31
Problema Cerere Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 0.99 kb
#include <fstream>
#include <vector>
using namespace std;
 
ifstream f("cerere.in");
ofstream g("cerere.out");
 
const int MAXN = 100005;
 
int n, boss[MAXN], pas[MAXN], visited[MAXN], coada[MAXN], in[MAXN], i, a, b, vf = -1;
vector<int> graph[MAXN];
 
void Parcurge(int nod)
{
    visited[nod] = 1;
    coada[++vf] = nod;
 
    if (boss[nod] == 0) pas[nod] = 0;
    else pas[nod] = pas[coada[vf - boss[nod]]] + 1;
 
    vector<int>::iterator it;
    for (it = graph[nod].begin(); it != graph[nod].end(); ++it)
        if (!visited[*it])
            Parcurge(*it);
 
    --vf;
}
 
int main() {
    f >> n;
 
    for (i = 1; i <= n; i++)
        f >> boss[i];
    for (i = 1; i <= n-1; i++)
    {
        f >> a >> b;
        graph[a].push_back(b);
        in[b]++;
    }
 
    int radacina;
    for (i = 1; i <= n;i++)
        if (!in[i])
            radacina = i;
 
    Parcurge(radacina);
 
    for (i = 1; i <= n; i++)
        g << pas[i] << ' ';
 
    return 0;
}