Pagini recente » Cod sursa (job #425011) | Cod sursa (job #2558905) | Cod sursa (job #414889) | Cod sursa (job #2125023) | Cod sursa (job #414373)
Cod sursa(job #414373)
#include<fstream>
using namespace std;
int t[100005],nivel[100005],solutia[100005],v[100005],n;
struct nod{
int info;
nod *next;};
nod *g[100005];
void adauga(int a,int b);
void dfs(int k,int niv);
int main()
{
ifstream fin("cerere.in");
freopen("cerere.out","w",stdout);
fin>>n;
int i;
for(i=1;i<=n;i++)
fin>>v[i];
for(i=1;i<n;i++)
{
int a,b;
fin>>a>>b;
adauga(a,b);
t[b]=a;
}
int radacina,pp=0;
for(i=1;i<=n && pp==0;i++)
if(t[i]==0)
radacina=i,pp=1;
dfs(radacina,0);
//for(i=1;i<=n;i++)
//printf("%d ",solutia[i]);
for(i=1;i<=n;i++)
{
int nr=0;
int y=i;
while(solutia[y])
nr++,y=solutia[y];
printf("%d ",nr);
}
return 0;
}
void dfs(int k,int niv)
{
niv++;
nivel[niv]=k;
if(v[k]!=0)
solutia[k]=nivel[niv-v[k]];
for(nod*p=g[k];p;p=p->next)
dfs(p->info,niv);
}
void adauga(int a,int b)
{
nod *p;
p=new nod;
p->info=b;
p->next=g[a];
g[a]=p;
}