Cod sursa(job #1076773)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 10 ianuarie 2014 16:08:03
Problema Cerere Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
int nr,stiva[100001],t[100001],k[100001],last[100001],next[100001],val[100001],v[100001];
char trecut[100001];
void dfs(int nod){
    int poz;
    trecut[nod]=1;
    nr++;
    stiva[nr]=nod;
    if(k[nod]!=0){
        v[nod]=1+v[stiva[nr-k[nod]]];
    }
    poz=last[nod];
    while(poz!=0){
        if(trecut[val[poz]]==0){
            dfs(val[poz]);
        }
        poz=next[poz];
    }
    nr--;
}
int main(){
    int n,i,x,y,radacina;
    FILE *fin,*fout;
    fin=fopen("cerere.in","r");
    fout=fopen("cerere.out","w");
    fscanf(fin,"%d",&n);
    for(i=1;i<=n;i++){
        fscanf(fin,"%d",&k[i]);
    }
    for(i=1;i<=n;i++){
        fscanf(fin,"%d%d",&x,&y);
        t[y]++;
        val[i]=y;
        next[i]=last[x];
        last[x]=i;
    }
    radacina=0;
    i=1;
    while(radacina==0){
        if(t[i]==0){
            radacina=i;
        }
        i++;
    }
    dfs(radacina);
    for(i=1;i<=n;i++){
        fprintf(fout,"%d ",v[i]);
    }
    fprintf(fout,"\n");
    fclose(fin);
    fclose(fout);
    return 0;
}