Cod sursa(job #1712986)

Utilizator antanaAntonia Boca antana Data 4 iunie 2016 14:04:54
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>
#define MAX 100000
using namespace std;
int r, lista[MAX+1], next[MAX], val[MAX];
int m, grf[MAX+1], nxt[MAX], nod[MAX], str[MAX+1], gr[MAX+1], rasp[MAX+1];
inline void adauga(int x, int y)
{
    val[++r]=y;
    next[r]=lista[x];
    lista[x]=r;
    gr[y]++;
}
inline void adauga2(int x, int y)
{
    nod[++m]=y;
    nxt[m]=grf[x];
    grf[x]=m;
}
int st[MAX+1];
void dfs1(int n, int lev)
{
    int p, vecin;
    p=lista[n];
    st[lev]=n;
    if(str[n])
        adauga2(st[lev-str[n]], n);
    while(p)
    {
        vecin=val[p];
        dfs1(vecin, lev+1);
        p=next[p];
    }
}
void dfs2(int n, int pas)
{
    int p;
    rasp[n]=pas;
    p=grf[n];
    while(p)
    {
        dfs2(nod[p], pas+1);
        p=nxt[p];
    }
}
int main()
{
    freopen("cerere.in", "r", stdin);
    freopen("cerere.out", "w", stdout);
    int n,x, y, nr;
    scanf("%d", &n);
    for(int i=1;i<=n;++i)
        scanf("%d", &str[i]);
    for(int i=1;i<n;++i)
    {
        scanf("%d%d", &x, &y);
        adauga(x, y);
    }
    for(int i=1;i<=n;++i)
        if(!gr[i])
            nr=i;
    dfs1(nr, 1);
    for(int i=1;i<=n;++i)
        if(!str[i])
            dfs2(i, 0);
    for(int i=1;i<=n;++i)
        printf("%d ", rasp[i]);
    return 0;
}