Pagini recente » Cod sursa (job #491320) | Cod sursa (job #962228) | Cod sursa (job #1222818) | Cod sursa (job #444881) | Cod sursa (job #1142920)
#include<cstdio>
#include<vector>
using namespace std;
#define NMAX 100001
#define pb push_back
int N , K[NMAX] , L[NMAX] , r , rad , sol[NMAX];
vector<int> G[NMAX] , g[NMAX];
bool u[NMAX];
void read();
void solve();
void write();
void DFS(int nod);
void dfs(int nod);
int main()
{
read();
solve();
write();
return 0;
}
void read()
{
int x , y;
freopen("cerere.in" , "r" , stdin );
scanf("%d" , &N );
for(int i = 1 ; i <= N ; ++i )
scanf("%d" , &K[i] );
for(int i = 1 ; i < N ; ++i )
{
scanf("%d%d" , &x , &y );
G[x].pb(y);
u[y] = 1;
}
}
void solve()
{
for(int i = 1 ; i <= N ; ++i )
if(!u[i])
{
rad = i;
break;
}
DFS(rad);
for(int i = 1 ; i <= N ; ++i )
dfs(i);
}
void DFS(int nod)
{
L[++r] = nod;
for(int i = 0 ; i<(int)G[nod].size() ; ++i )
DFS(G[nod][i]);
if(K[nod])
g[L[r-K[nod]]].pb(nod);
r--;
}
void write()
{
freopen("cerere.out" , "w" , stdout );
for(int i = 1 ; i <= N ; ++i )
printf("%d " , sol[i]);
}
void dfs(int nod)
{
for(int i = 0 ; i < (int)g[nod].size() ; ++i )
{
sol[g[nod][i]] = sol[nod]+1;
dfs(g[nod][i]);
}
}