Pagini recente » Cod sursa (job #1876834) | Cod sursa (job #2635719) | Cod sursa (job #2643386) | Cod sursa (job #650313) | Cod sursa (job #986536)
Cod sursa(job #986536)
#include <cstdio>
#include <vector>
#include <stack>
#define FILEIN "cerere.in"
#define FILEOUT "cerere.out"
using namespace std;
const int NMAX = 100005;
int N;
int K[NMAX];
int G[NMAX];
vector<int> F[NMAX], P[NMAX];
vector<int> next[NMAX];
int st[NMAX];
int top;
void dfs(int node) {
st[top] = node;
top++;
if (K[node] != 0) {
next[st[top-K[node]-1]].push_back(node);
}
size_t i;
for ( i = 0; i < F[node].size(); i++ ) {
dfs(F[node][i]);
}
top--;
}
void dfs2(int node, int depth) {
G[node] = depth;
size_t i;
for ( i = 0; i < next[node].size(); i++) {
dfs2(next[node][i], depth+1);
}
}
int main()
{
top = 0;
int i, x, y;
freopen(FILEIN, "r", stdin);
freopen(FILEOUT, "w", stdout);
scanf("%d", &N);
for ( i = 1; i <= N; i++) {
scanf("%d", &K[i]);
}
for ( i = 1; i < N; i++) {
scanf("%d %d", &x, &y);
F[x].push_back(y);
P[y].push_back(x);
}
int rootnode = -1;
for ( i = 1; i <= N && rootnode == -1; i++) {
if (P[i].size() == 0)
rootnode = i;
}
dfs(rootnode);
for ( i = 1; i <= N; i++ ) {
if (K[i] == 0) {
dfs2(i, 0);
}
}
for ( i = 1; i <= N; i++ ) {
printf("%d ", G[i]);
}
printf("\n");
return 0;
}