Cod sursa(job #1883110)

Utilizator roxanastRoxana Stiuca roxanast Data 17 februarie 2017 18:54:13
Problema Cerere Scor 0
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 0.95 kb
#include <fstream>
#define NMAX 100010
using namespace std;

int n,nr,i,k[NMAX],G[NMAX],A,B,radacina;
int vf[2*NMAX],lst[NMAX],urm[NMAX];
bool aretata[NMAX],viz[NMAX];
int stiva[NMAX],cnt=0;
ifstream f("cerere.in");
ofstream g("cerere.out");

void dfs(int x){
    viz[x]=true;
    stiva[++cnt]=x;
    if(k[x]==0)
        G[x]=0;
    else
        G[x]=G[stiva[cnt-k[x]]]+1;
    int poz=lst[x],y;
    while(poz!=0){
        y=vf[poz];
        if(!viz[y])
            dfs(y);
        poz=urm[poz];
    }
    cnt--;
}
int main()
{
    f>>n;
    for(i=1;i<=n;i++)
        f>>k[i];

    for(i=1;i<n;i++){
        f>>A>>B;
        ////////////
        nr++;
        vf[nr]=B;
        urm[nr]=lst[A];
        lst[A]=nr;
        //////////
        aretata[B]='1';
    }
    for(i=1;i<=n&&radacina==0;i++)
        if(aretata[i]!='1')
        radacina=i;
    dfs(radacina);
    for(i=1;i<=n;i++)
        g<<G[i]<<" ";

    return 0;
}