Cod sursa(job #601727)

Utilizator vlad2901Vlad Berindei vlad2901 Data 7 iulie 2011 16:33:00
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <stdio.h>
#define MAX 100001

int sol[MAX], c[MAX], n, viz[MAX], g[MAX], stiva[MAX], poz=1;

struct nod
{
    int info;
    nod *next;
} *a[MAX];

void df(int nod);

int main()
{
    int i, t, f, rad;
    nod *nou;

    FILE *fin = freopen("cerere.in", "r", stdin);
    FILE *fout = freopen("cerere.out", "w", stdout);

    scanf("%d", &n);

    sol[0] = 0;

    for(i = 1 ;i<=n;++i)
    {
        scanf("%d", &c[i]);
    }

    for(i=0;i<n-1;++i)
    {
        scanf("%d %d", &t, &f);
        g[f]++;
        nou = new nod;
        nou->info = f;
        nou->next = a[t];
        a[t] = nou;
    }

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

    df(rad);

    for(i=1;i<=n;++i)
    {
        printf("%d ", sol[i]);
    }

    return 0;
}


void df(int nd)
{
    nod *curent;
    int pozc;

    pozc = poz;

    viz[nd] = 1;
    stiva[poz] = nd;


    if(c[nd] == 0)
    {
        sol[nd] = 0;
    }
    else
    {
        sol[nd] = 1 + sol[stiva[poz-c[nd]]];
    }

        poz++;

    for(curent = a[nd];curent;curent = curent->next)
    {
        if(!viz[curent->info])
        {
            df(curent->info);
        }
    }

    poz = pozc;

}