Pagini recente » Cod sursa (job #1518782) | Cod sursa (job #3182503) | Cod sursa (job #2887826) | Cod sursa (job #859954) | Cod sursa (job #2502821)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("cerere.in");
ofstream out ("cerere.out");
const int N=100001;
int lst[N],urm[N*2],vf[N*2],v[N],d[N],n,nr,f[N],parent[N];
bool viz[N];
void adauga (int x,int y)
{
vf[++nr]=y;
urm[nr]=lst[x];
lst[x]=nr;
}
int stm (int x, int r)
{
while (r)
{
x=parent[x];
r--;
}
return x;
}
void dfs (int x)
{
viz[x]=true;
if (v[x]==0) d[x]=0;
else d[x]=d[stm(x,v[x])]+1;
for (int p=lst[x];p!=0;p=urm[p])
{
int y=vf[p];
if (!viz[y])
{
dfs (y);
}
}
}
int main()
{
int n,p,x,y;
in>>n;
for (int i=1;i<=n;i++)
in>>v[i];
for (int i=1;i<n;i++)
{
in>>x>>y;
adauga (x,y);
adauga (y,x);
f[y]++;
parent[y]=x;
}
for (int i=1;i<=n;i++)
if (f[i]==0)
{
p=i;
break;
}
dfs (p);
for (int i=1;i<=n;i++)
out<<d[i]<<' ';
return 0;
}