Pagini recente » Cod sursa (job #491881) | Cod sursa (job #757479) | Cod sursa (job #1841195) | Cod sursa (job #2930574) | Cod sursa (job #357634)
Cod sursa(job #357634)
#include<stdio.h>
#include<vector>
using namespace std;
vector <int> v[100001];
int k[100001],ancestor[100001],nr[100001],depth[100001];
void df(int rad,int niv)
{
depth[niv]=rad;
if(k[rad]!=0)
ancestor[rad]=depth[niv-k[rad]];
for(int i=0;i<(int)v[rad].size();i++)
df(v[rad][i],niv+1);
}
void solve(int rad)
{
if(nr[rad]>0 || k[rad]==0)
return;
solve(ancestor[rad]);
nr[rad]=1+nr[ancestor[rad]];
}
int main()
{
int i,a,b,rad,n,father[100001];
FILE *f=fopen("cerere.in","r");
fscanf(f,"%i",&n);
for(i=1;i<=n;i++)
{
fscanf(f,"%i",k+i);
father[i]=-1;
nr[i]=0;
}
for(i=0;i<n;i++)
{
fscanf(f,"%i%i",&a,&b);
v[a].push_back(b);
father[b]=a;
}
fclose(f);
for(i=1;i<=n;i++)
if(father[i]==-1)
{
rad=i;
break;
}
df(rad,0);
for(i=1;i<=n;i++)
solve(i);
f=fopen("cerere.out","w");
for(i=1;i<n;i++)
fprintf(f,"%i ",nr[i]);
fprintf(f,"%i\n",nr[n]);
fclose(f);
return 0;
}