Pagini recente » Cod sursa (job #1365737) | Cod sursa (job #1128543) | Cod sursa (job #3267068) | Cod sursa (job #801799) | Cod sursa (job #2511178)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("cerere.in");
ofstream out("cerere.out");
const int dim = 100005;
int vf[2*dim],urm[2*dim],lst[dim],nr,n,v[dim],stramos[dim],maxi,cerere[dim];
vector<int> vc;
vector<int> vi[dim];
void Adauga(int x,int y)
{
vf[++nr] = y;
urm[nr] = lst[x];
lst[x] = nr;
}
void DFS(int nod,int parent,int adancime)
{
vi[adancime].push_back(nod);
maxi = max(maxi , adancime);
vc.push_back(nod);
if ( vc.size() - v[nod] - 1 >= 0)
stramos[nod] = vc.at( vc.size() - v[nod] - 1);
for (int p = lst[nod]; p!=0; p = urm[p])
{
int y = vf[p];
if (y != parent) DFS(y, nod, adancime+1);
}
vc.pop_back();
}
int main()
{
in >> n;
for (int i=1; i<=n; i++) in >> v[i];
for (int i=1,x,y; i<=n-1; i++)
{
in >> x >> y;
Adauga(x,y);
/// Adauga(y,x);
}
DFS(1,0,0);
for (int i=1; i<=maxi; i++)
{
for (auto vec:vi[i])
{
if (stramos[vec] == vec) cerere[vec] = 0;
else cerere[vec] = 1 + cerere[stramos[vec]];
}
}
for (int i=1; i<=n; i++) out << cerere[i] << " ";
return 0;
}