Cod sursa(job #277177)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 11 martie 2009 16:03:42
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <stdio.h>
#define lg_max 1000010

struct nod
{
     int inf;
     nod *next;
}*sir[lg_max];

int tata[lg_max],cati[lg_max],pasi[lg_max];
int ord[lg_max],viz[lg_max];
int rad,n;

void baga(int a,int b)
{
     nod *q=new nod;
     q->inf=b;
     q->next=sir[a];
     sir[a]=q;
}

void citire()
{
     int a,b;
     scanf ("%d",&n);
     for (int i=1;i<=n;i++)
          scanf ("%d ",&cati[i]);

     for (int i=0;i<n;i++)
     {
          scanf ("%d %d",&a,&b);
          baga(a,b);
          tata[b]=a;
          pasi[i]=-1;
     }

     for (int i=1;i<=n;i++)
          if (tata[i]==0)
          {
               rad=i;
               return ;
          }
}

int cauta(int nod )
{
     int aux=cati[nod],num=0;
     while (aux)
     {
          aux--;
          nod=tata[nod];
          if (!aux)
          {
               num++;
               aux=cati[nod];
               if (pasi[nod]!=-1)
                    return num+pasi[nod];
          }
     }
     return num;
}

void df()
{
     ord[0]=rad;
     pasi[rad]=0;
     int nr=1;
     for (int i=0;i<nr;i++)
          for (nod *q=sir[ord[i]];q;q=q->next)
               if (!viz[q->inf])
               {
                    viz[q->inf]=1;
                    pasi[q->inf]=cauta(q->inf);
                    ord[nr++]=q->inf;
               }
}

void afisare()
{
     for (int i=1;i<=n;i++)
          printf("%d ",pasi[i]);
     printf("\n");
}

int main ()
{
     freopen ("cerere.in","r",stdin);
     freopen ("cerere.out","w",stdout);
     citire();
     df();
     afisare();
     return 0;
}