Pagini recente » Borderou de evaluare (job #1566700) | Cod sursa (job #2234031) | Cod sursa (job #1151910) | Cod sursa (job #806336) | Cod sursa (job #277177)
Cod sursa(job #277177)
#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;
}