1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #include<bits/stdc++.h> #define LL long long using namespace std; const int N = 50000 + 5; int n; int a[N]; int idx; int e[N << 1], ne[N << 1], h[N]; void add(int x, int y) { idx ++; e[idx] = y, ne[idx] = h[x], h[x] = idx; } int val[N], cnt; int son[N]; void dfs(int x, int father) { for(int i = h[x]; ~i;i = ne[i]) { int j = e[i]; if(father == j) continue; dfs(j, x); int v = min(val[x], val[j]); val[x] -= v; val[j] -= v; cnt += v * 2; if(val[j]) son[x] = j; } } int ans[N]; void dfs1(int x, int father) { ans[x] = cnt; for(int i = h[x]; ~i;i = ne[i]) { int j = e[i], type; if(j == father) continue; if(val[x]) val[x] --, cnt ++, type = 1; else if(son[j]) val[son[j]] --, cnt ++, type = 2; else val[j] ++, cnt --, type = 3; dfs1(j, x); if(type == 1) val[x] ++, cnt --; if(type == 2) val[son[j]] ++, cnt --; if(type == 3) val[j] --, cnt ++; } } int main() { memset(h, -1, sizeof(h)); scanf("%d", &n); for(int i = 0;i < n;i ++) scanf("%d", &val[i]); for(int i = 1;i < n;i ++) { int o, u; scanf("%d%d", &o, &u); add(o, u); add(u, o); val[o] --, val[u] --, cnt += 2; } dfs(0, -1), dfs1(0, -1); for(int i = 0;i < n;i ++) printf("%d\n", ans[i]); return 0; }
|