Cod sursa(job #66102)

Utilizator DastasIonescu Vlad Dastas Data 15 iunie 2007 17:33:58
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#define maxn 100001

FILE *in = fopen("cerere.in","r"), *out = fopen("cerere.out","w");

struct graf
{
    int nod;
    graf *next;
};

int n;
graf *a[maxn];
int Ki[maxn];
int rez[maxn];

int rad;

int st[maxn];
int k = 0;

void add(graf *&p, int nod)
{
    graf *q = new graf;
    q->next = p;
    q->nod = nod;
    p = q;
}

void read()
{
    fscanf(in, "%d", &n);

    for ( int i = 1; i <= n; ++i )
        fscanf(in, "%d", &Ki[i]);

    int x, y;
    for ( int i = 1; i < n; ++i )
    {
        fscanf(in, "%d %d", &x, &y);
        add(a[x], y);
        ++st[y];
    }
}

void DF(int nod)
{
    st[++k] = nod;
    if ( Ki[nod] == 0 )
        rez[nod] = 0;
    else
        rez[nod] = rez[st[k-Ki[nod]]] + 1;

    graf *q = a[nod];
    while ( q )
    {
        DF(q->nod);
        --k;
        q = q->next;
    }
}

int main()
{
    read();

    for ( int i = 1; i <= n; ++i )
        if ( st[i] == 0 )
        {
            rad = i;
            break;
        }

    DF(rad);

    for ( int i = 1; i <= n; ++i )
        fprintf(out, "%d ", rez[i]);

	return 0;
}