Pagini recente » Cod sursa (job #3268832) | Cod sursa (job #2721651) | Cod sursa (job #862084) | Cod sursa (job #189481) | Cod sursa (job #1675955)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("cerere.in");
ofstream out("cerere.out");
const int N_max = 100002;
int lst[N_max];
int vf[N_max];
int urm[N_max];
int nr;
int v[N_max];
bool viz[N_max];
int grad[N_max];
int st[N_max];
int lev;
int sol[N_max];
int N;
void adauga(int x, int y)
{
/* ADAUGA IN LISTA LUI x PE y */
nr++;
vf[nr] = y;
urm[nr] = lst[x];
lst[x] = nr;
}
void dfs(int x)
{
int p, y;
viz[x] = true;
st[++lev] = x;
sol[x] = sol[ st[lev - v[x]] ] + 1;
if(!v[x]) sol[x] = 0;
/* PARCURG VECINII y AI LUI x */
p = lst[x];
while(p != 0)
{
y = vf[p];
if(!viz[y]) dfs(y);
p = urm[p];
}
st[lev--] = 0;
}
void solve()
{
int i, x, y, radacina;
in >> N;
for(i = 1; i <= N; i++) in >> v[i];
for(i = 1; i < N; i++)
{
in >> x >> y;
adauga(x, y);
grad[y]++;
}
for(i = 1; i <= N; i++)
if(!grad[i]) radacina = i;
dfs(radacina);
for(i = 1; i <= N; i++) out << sol[i] << " ";
}
int main()
{
solve();
return 0;
}