Pagini recente » Cod sursa (job #2331391) | Cod sursa (job #623975) | Cod sursa (job #1563885) | Cod sursa (job #1591692) | Cod sursa (job #986540)
Cod sursa(job #986540)
#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];
int st[NMAX];
int top;
void dfs(int node) {
st[top] = node;
top++;
if (K[node] != 0) {
G[node] = G[st[top-K[node]-1]] + 1;
}
size_t i;
for ( i = 0; i < F[node].size(); i++ ) {
dfs(F[node][i]);
}
top--;
}
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;
}