Pagini recente » Cod sursa (job #704369) | Cod sursa (job #2612053) | Cod sursa (job #725572) | Cod sursa (job #3253402) | Cod sursa (job #501315)
Cod sursa(job #501315)
#include <cstdio>
#include <cassert>
#include <vector>
#define Nmax 100005
#define InFile "cerere.in"
#define OutFile "cerere.out"
using namespace std;
int n, vf=-1;
int K[Nmax], viz[Nmax], stv[Nmax], ft[Nmax], nr[Nmax];
vector <int> A[Nmax];
void read();
void DFS (int);
void write();
int main()
{
int i;
assert (freopen (InFile, "r", stdin));
assert (freopen (OutFile, "w", stdout));
read();
for (i=1; i<=n; i++)
if (!ft[i])
{
stv[++vf]=i; DFS (i);
break;
}
write();
return 0;
}
void read()
{
int i, x, y;
scanf ("%d\n", &n);
for (i=1; i<=n; i++)
scanf ("%d ", &K[i]);
for (i=1; i<n; i++)
{
scanf ("%d %d\n", &x, &y);
ft[y]=x;
A[x].push_back (y);
}
}
void DFS (int nd)
{
int i, lg;
viz[nd]=1;
if (K[nd])
nr[nd]=1+nr[stv[vf-K[nd]]];
lg=A[nd].size();
for (i=0; i<lg; i++)
if (!viz[A[nd][i]])
{
stv[++vf]=A[nd][i];
DFS (A[nd][i]);
vf--;
}
}
void write()
{
int i;
for (i=1; i<=n; i++)
printf ("%d ", nr[i]);
printf ("\n");
}