Pagini recente » Cod sursa (job #1385341) | Cod sursa (job #2350849) | Cod sursa (job #979239) | Cod sursa (job #469829) | Cod sursa (job #2681571)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
const int DIM = 100005;
int n,k[DIM],Ans[DIM],In[DIM],x,y,root,seen[DIM],m,St[DIM];
vector <int> G[DIM];
void Read()
{
fin>>n;
for(int i=1;i<=n;i++)
fin>>k[i];
for(int i=1;i<n;i++)
{
fin>>x>>y;
G[x].push_back(y);
In[y]++;
}
}
void FindRoot()
{
for(int i=1;i<=n;i++)
{
if(!In[i])
{
root=i;
break;
}
}
}
void DFS(int node)
{
seen[node]=1;
vector <int> ::iterator it;
for(it=G[node].begin();it!=G[node].end();it++)
{
if(!seen[*it])
{
if(seen[node]>1)
{
while(St[m]!=node && m>0)
m--;
}
m++;
St[m]=(*it);
if(k[(*it)]!=0)
Ans[(*it)]=Ans[St[m-k[(*it)]]]+1;
seen[node]++;
DFS(*it);
}
}
}
void Print()
{
for(int i=1;i<=n;i++)
fout<<Ans[i]<<" ";
fout<<'\n';
}
int main()
{
Read();
FindRoot();
m=1;St[m]=root;
DFS(root);
Print();
}