Pagini recente » Cod sursa (job #2443501) | Cod sursa (job #1043783) | Cod sursa (job #3161720) | Cod sursa (job #2619309) | Cod sursa (job #277223)
Cod sursa(job #277223)
// DFS nu BFS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#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,nr;
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 ;
}
}
void df(int nodd)
{
for (nod *q=sir[nodd];q;q=q->next)
{
ord[nr++]=q->inf;
pasi[q->inf]=pasi[ord[nr-1-cati[q->inf]]]+1;
df(q->inf);
nr--;
}
}
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();
ord[0]=rad;
pasi[rad]=0;
nr=1;
df(rad);
for (int i=1;i<=n;i++)
if (pasi[i]==-1 && tata[i]==0)
df(i);
afisare();
return 0;
}