Pagini recente » Cod sursa (job #2856074) | Cod sursa (job #334513) | Cod sursa (job #2743453) | Cod sursa (job #2303946) | Cod sursa (job #982652)
Cod sursa(job #982652)
#include<stdio.h>
#include<vector>
#include<queue>
#define NMAX 100007
using namespace std;
int nr, n;
queue < int > q;
vector < int > v[NMAX];
int viz[NMAX], a[NMAX], Stack[NMAX], sol[NMAX];
void dfs(int u)
{
Stack[++ Stack[0]] = u;
viz[u] = 1;
if(a[u])
sol[u] = sol[Stack[Stack[0] - a[u]]] + 1;
for(vector<int> :: iterator i = v[u].begin(); i != v[u].end(); ++ i)
if(viz[*i] == 0)
dfs(*i);
-- Stack[0];
}
int main(){
int u = 0, x = 0, y = 0;
freopen("cerere.in", "r", stdin);
freopen("cerere.out", "w", stdout);
scanf("%d", &n);
for(int i = 1; i <= n; ++ i){
scanf("%d", &a[i]);
if(a[i] == 0 && u == 0)
u = i;
}
for(int i = 1; i < n; ++ i){
scanf("%d %d", &x, &y);
v[x].push_back(y);
viz[y] = 0;
}
for(int i = 1; i <= n; ++ i)
if(! viz[i]){
dfs(i);
break;
}
for(int i = 1; i <= n; ++ i)
printf("%d ", sol[i]);
return 0;
}