Cod sursa(job #271561)

Utilizator FlorianFlorian Marcu Florian Data 5 martie 2009 15:30:50
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<stdio.h>
FILE*f=fopen("cerere.in","r");
FILE*g=fopen("cerere.out","w");
int K[100003];
int n,m;
int st[100003];
int viz[100003];
int sol[100003],p;
int R, tata[100003];
struct Nod
 {
  int vf;
  Nod *urm;
 };
Nod *G[100003];
void insert(int x, int y)
 {
  Nod *q;
  q=new Nod;
  q->vf = y;
  q->urm=G[x];
  G[x]=q;
 }
void read()
 {
  fscanf(f,"%d",&n);
  int i;
  for(i=1;i<=n;++i) fscanf(f,"%d",&K[i]);
  for(i=1;i<n;++i)
   {
    int a,b;
    fscanf(f,"%d%d",&a,&b);
    tata[b] = a;      // muchie de la a la b
    insert(a,b);
   }
  for(i=1;i<=n;++i) if(!tata[i]) { R=i; break; }
   
 }
void DF()
 {
  int ok,vf=0, nod;
  Nod *q;
  st[++vf] = R;
  viz[R] = 1;
  while(vf)
   {
    nod = st[vf];
    ok=0;
    for(q=G[nod];q;q=q->urm)
     {
      if(!viz[q->vf])
       {
        viz[q->vf] = 1;
        st[++vf] = q->vf;
        if(K[q->vf]) sol[q->vf] = sol[st[vf - K[q->vf]]] + 1;
        ok=1;
        break;
       }
      }
    if(ok==1);
    else --vf;
   }
  for(int i=1;i<=n;++i) fprintf(g,"%d ",sol[i]);
 }
int main()
 {
  read();
  DF();
  return 0;
 }