Pagini recente » Cod sursa (job #210906) | Cod sursa (job #827247) | Cod sursa (job #2843957) | Cod sursa (job #1337039) | Cod sursa (job #1142927)
#include<cstdio>
#include<vector>
#include<cstring>
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;
}
memset(u,0,sizeof(u));
DFS(rad);
for(int i = 1 ; i <= N ; ++i )
if(u[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);u[L[r-K[nod]]] = 1;}
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]);
}
}