Cod sursa(job #197031)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 30 iunie 2008 20:59:14
Problema Cerere Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <stdio.h>
#include <stdlib.h>
#define N 100010
#define FIN "cerere.in"
#define FOUT "cerere.out"
int n;
int *cine[N],cati[N],viz[N],grad[N],k[N],strm[N];
void scan(void){
     int i,a,b;
     freopen(FIN,"r",stdin);
     freopen(FOUT,"w",stdout);
     scanf("%d",&n);
     for (i=1;i<=n;++i)
         scanf("%d",&k[i]);
     for (i=1;i<=n-1;++i){
         scanf("%d%d",&a,&b);
         ++grad[b];
         ++cati[a];
         cine[a]=(int*)realloc(cine[a],cati[a]*sizeof(int)+4);
         cine[a][cati[a]]=b;
     }
}
int stiva[N],nrs=0;
void df(int x){
     int i;
     viz[x]=1;
     stiva[++nrs]=x;
     if (k[x]!=0)
        strm[x]=stiva[nrs-k[x]];
     else
         strm[x]=x;
     for (i=1;i<=cati[x];++i)
         if (!viz[cine[x][i]])
            df(cine[x][i]);
     --nrs;
}
int vizitat[N],ord[N];
void bf(int x){
     int coada[N],p,u,i,e;
     p=u=0;
     coada[u++]=x;ord[u]=x;
     while (p<u){
           e=coada[p++];
           for (i=1;i<=cati[e];++i){
               if (!vizitat[cine[e][i]]){
                  coada[u++]=cine[e][i];
                  ord[u]=cine[e][i];
               }
           }
     }
}
int sol[N];
void solve(void){
     int i,parent=1;
     for (i=1;i<=n;++i)
         if (grad[i]==0)
            parent=i;
     df(parent);
     bf(parent);
     for (i=1;i<=n;++i){
         if (k[ord[i]]==0)
            sol[ord[i]]=0;
         else
             sol[ord[i]]=sol[strm[ord[i]]]+1;
     }     
     for (i=1;i<=n;++i)
         printf("%d ",sol[i]);
}
void print(void){
     fclose(stdin);
     fclose(stdout);
     exit(0);
}
int main(void){
    scan();
    solve();
    print();
}