Pagini recente » Cod sursa (job #1502543) | Cod sursa (job #2743117) | Cod sursa (job #194925) | Cod sursa (job #1133708) | Cod sursa (job #943766)
Cod sursa(job #943766)
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std ;
#define maxn 100001
int n ;
int v[maxn], sol[maxn], tata[maxn] ;
bool sel[maxn] ;
vector<int> graf[maxn] ;
vector<int> coada ;
int rad = 1 ;
void dfs(int nod)
{
sel[nod] = true ;
coada.push_back( nod ) ;
if( v[nod] == 0 )
sol[nod] = 0 ;
else
sol[nod] = sol[ coada[ coada.size() - 1 - v[nod] ] ] + 1 ;
for(size_t i = 0; i < graf[nod].size(); ++i )
if( sel[ graf[nod][i] ] == false )
dfs( graf[nod][i] ) ;
coada.pop_back() ;
}
void citire()
{
freopen("cerere.in", "r", stdin);
freopen("cerere.out", "w", stdout);
cin >> n ;
for(int i = 1; i <= n; ++i )
cin >> v[i] ;
for(int i = 1; i <= n - 1; ++i )
{
int a, b ;
cin >> a >> b ;
tata[b] = a ;
graf[a].push_back( b ) ;
}
}
void afla_radacina()
{
sol[0] = -1 ;
while( tata[rad] != 0 )
rad = tata[rad] ;
}
void afisare()
{
for(int i = 1; i <= n; ++i )
cout << sol[i] << " " ;
}
int main()
{
citire() ;
afla_radacina() ;
dfs( rad ) ;
afisare() ;
return 0 ;
}