Cod sursa(job #1435749)

Utilizator andi12Draghici Andrei andi12 Data 14 mai 2015 12:35:09
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include <cstdio>

using namespace std;
const int N=100001;
int vf[N];
int urm[2*N];
int lst[2*N];
int nr;
int str[N];
int v[N];
int sol[N];
bool viz[N];
void ad(int x,int y)
{
    nr++;
    vf[nr]=y;
    urm[nr]=lst[x];
    lst[x]=nr;
}
void dfs(int x)
{
    int poz=lst[x];
    v[++nr]=x;
    viz[x]=true;
    if(str[x]!=0)
        sol[x]=1+sol[v[nr-str[x]]];
    while(poz!=0)
    {
        if(viz[vf[poz]]==false)
            dfs(vf[poz]);
        poz=urm[poz];
    }
    nr--;
}
int main()
{
    FILE *in,*out;
    in=fopen("cerere.in","r");
    out=fopen("cerere.out","w");
    int n,i,j,x,y;
    fscanf(in,"%d",&n);
    for(i=1;i<=n;i++)
        fscanf(in,"%d",&str[i]);
    for(i=1;i<=n;i++)
    {
        fscanf(in,"%d%d",&x,&y);
        ad(x,y);
        ad(y,x);
    }
    nr=0;
    dfs(1);
    for(i=1;i<=n;i++)
        fprintf(out,"%d ",sol[i]);
    return 0;
}