Pagini recente » Cod sursa (job #803471) | Cod sursa (job #2847881) | Cod sursa (job #1739951) | Cod sursa (job #1107058) | Cod sursa (job #2476191)
#include <fstream>
#include <queue>
using namespace std;
ifstream f ("cerere.in");
ofstream g ("cerere.out");
int const NM = 1e5 + 1;
int v [NM] , vf [NM] , nxt [NM];
int k [NM] , sz , t [NM];
int dp [NM] , st [NM] , h [NM];
void add (int x , int y){
vf [++ sz] = y;
nxt [sz] = v [x];
v [x] = sz;
}
int o;
void BF (int start){
static queue <int> q;
q . push (start);
while (0 < q . size ()){
int x = q . front ();
for(int i = v [x] ; i ; i = nxt [i]){
int j = vf [i];
h [j] = 1 + h [x];
q . push (j);
}
q . pop ();
}
}
void DF (int node){
while (o && h [st [o]] >= h [node])
-- o;
st [++ o] = node;
for(int i = v [node] ; i ; i = nxt [i]){
int j = vf [i];
if (k [j])
dp [j] = 1 + dp [st [o - k [j] + 1]];
DF (j);
}
-- o;
}
int main()
{
int n;
f >> n;
for(int i = 1 ; i <= n ; ++ i)
f >> k [i];
for(int i = 1 ; i < n ; ++ i){
int a , b;
f >> a >> b;
add (a , b);
t [b] = a;
}
for(int i = 1 ; i <= n ; ++ i)
if (! t [i]){
BF (i);
DF (i);
}
for(int i = 1 ; i <= n ; ++ i)
g << dp [i] << ' ';
return 0;
}