Pagini recente » Cod sursa (job #889139) | Cod sursa (job #543776) | Cod sursa (job #751932) | Cod sursa (job #1603213) | Cod sursa (job #1435753)
#include <cstdio>
using namespace std;
const int N=100001;
int vf[N];
int urm[2*N];
int lst[2*N];
int nr;
int str[N];
int v[N];
int sol[N];
bool viz[N];
bool rad[N];
void ad(int x,int y)
{
nr++;
vf[nr]=y;
urm[nr]=lst[x];
lst[x]=nr;
}
void dfs(int x)
{
int poz=lst[x];
v[++nr]=x;
viz[x]=true;
if(str[x]!=0)
sol[x]=1+sol[v[nr-str[x]]];
while(poz!=0)
{
if(viz[vf[poz]]==false)
dfs(vf[poz]);
poz=urm[poz];
}
nr--;
}
int main()
{
FILE *in,*out;
in=fopen("cerere.in","r");
out=fopen("cerere.out","w");
int n,i,x,y;
fscanf(in,"%d",&n);
for(i=1;i<=n;i++)
fscanf(in,"%d",&str[i]);
for(i=1;i<=n;i++)
{
fscanf(in,"%d%d",&x,&y);
ad(x,y);
ad(y,x);
rad[y]=true;
}
for(i=1;i<=n;i++)
if(rad[i]==false)
x=i;
nr=0;
dfs(x);
for(i=1;i<=n;i++)
fprintf(out,"%d ",sol[i]);
return 0;
}