Pagini recente » Cod sursa (job #1251050) | Cod sursa (job #3282467) | Cod sursa (job #15165) | Cod sursa (job #2476507) | Cod sursa (job #1053615)
#include <fstream>
using namespace std;
ifstream fin ("cerere.in");
ofstream fout ("cerere.out");
struct nod
{
int info;
nod *next;
};
nod *l[100001];
void dfs(int ),push(int ),push(int , int );
char c[100001];
bool viz[100001];
int n,vf,s[100001],v[100001],sol[100001];
int main()
{
int i,a,b,root;
fin>>n;
for(i=1;i<=n;i++)
fin>>v[i];
for(i=1;i<n;i++)
{
fin>>a>>b;
push(a,b);
c[b]=1;
}
for(i=1;i<=n;i++)
if(c[i]==0)
{
root=i;
break;
}
push(root);
dfs(root);
for(i=1;i<=n;i++)
fout<<sol[i]<<" ";
return 0;
}
void dfs(int x)
{
viz[x]=true;
push(x);
if(v[x]==0)
sol[x]=0;
else
sol[x]=sol[s[vf-v[x]]]+1;
for(nod *nc=l[x];nc!=NULL;nc=nc->next)
{
if(!viz[nc->info])
dfs(nc->info);
}
s[vf]=0;
vf--;
}
void push(int x, int y)
{
nod *nc=new(nod);
nc->info=y;
nc->next=l[x];
l[x]=nc;
}
void push(int a)
{
vf++;
s[vf]=a;
}