/*
* [Ctsc2010]星际旅行.cpp
*
* Created on: 2011-4-19
* Author: user
*/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <climits>
#include <cstring>
#include <vector>
#define foreach(e,x) for(__typeof(x.begin()) e=x.begin();e!=x.end();++e)
using namespace std;
const int MAX_N_VERTEXS = 50000 + 10;
struct Vertex {
vector<Vertex*> adj;
int H;
int am[2][2];//normal ,if inc?
int chAmSum[2];
int ans;
int dist;//dist from root to it
int am2[2];//it's father chose or not/outside of subtree and it's ancs are inced
Vertex*father;
};
Vertex vs[MAX_N_VERTEXS];
int nVs;
Vertex*que[MAX_N_VERTEXS];
void readInput() {
cin >> nVs;
for (int i = 0; i < nVs; ++i) {
scanf("%d", &vs[i].H);
}
for (int i = 0; i < nVs - 1; ++i) {
int a, b;
scanf("%d%d", &a, &b);
Vertex*u = vs + a, *v = vs + b;
u->adj.push_back(v);
v->adj.push_back(u);
}
}
void doBFS(Vertex*root) {
int qh = 0, qt = 0;
que[qt++] = root;
root->father = 0;
root->dist = 0;
for (; qh < qt;) {
Vertex*u = que[qh++];
foreach(iter,u->adj) {
Vertex*v = *iter;
if (v == u->father)
continue;
que[qt++] = v;
v->father = u;
v->dist = u->dist + 1;
}
}
}
void work() {
Vertex*root = vs + 0;
doBFS(root);
//calc am
for (int at = nVs - 1; at >= 0; --at) {
Vertex*u = que[at];
for (int cf = 0; cf < 2; ++cf) {
for (int inc = 0; inc < 2; ++inc) {
int val = u->H + inc;
int&ret = u->am[cf][inc];
ret = INT_MAX;
for (int cme = 0; cme < 2; ++cme) {
if (!cf && !cme)
continue;
int tmp = cme ? val : 0;
foreach(iter,u->adj) {
Vertex*v = *iter;
if (v == u->father)
continue;
tmp += v->am[cme][0];
}
ret = min(ret, tmp);
}
}
}
for (int c = 0; c < 2; ++c) {
u->chAmSum[c] = 0;
foreach(iter,u->adj) {
Vertex*v = *iter;
if (v == u->father)
continue;
u->chAmSum[c] += v->am[c][0];
}
}
}
//calc am2
root->am2[0] = 0;
root->am2[1] = 0;
for (int i = 1; i < nVs; ++i) {
Vertex*u = que[i];
for (int cf = 0; cf < 2; ++cf) {
int&ret = u->am2[cf];
ret = INT_MAX;
for (int cg = 0; cg < 2; ++cg) {
if (!cg && !cf)
continue;
int tmp = 0;
if (cf) {
if (u->father != vs)
tmp += u->father->H + 1;
else
tmp += u->father->H;
}
tmp += u->father->am2[cg];
tmp += u->father->chAmSum[cf];
tmp -= u->am[cf][0];
ret = min(ret, tmp);
}
}
// cout << u->am2[0] << " " << u->am2[1] << endl;
}
//calc ans
for (int i = 0; i < nVs; ++i) {
Vertex*u = que[i];
int&ret = u->ans;
ret = INT_MAX;
for (int cf = 0; cf < 2; ++cf) {
int tmp = 0;
tmp += u->am2[cf];
if (u == vs)
tmp += u->am[cf][0];
else
tmp += u->am[cf][1];
ret = min(ret, tmp);
}
}
//output
for (int i = 0; i < nVs; ++i) {
int ans = vs[i].ans;
ans += nVs - 1;
ans *= 2;
ans -= vs[i].dist;
printf("%d\n", ans);
}
}
void prepare() {
for (int i = 0; i < nVs; ++i) {
vs[i].H -= vs[i].adj.size();
}
}
void solve() {
readInput();
prepare();
work();
}
int main() {
solve();
}
LyoKICogIFtDdHNjMjAxMF3mmJ/pmYXml4XooYwuY3BwCiAqCiAqICBDcmVhdGVkIG9uOiAyMDExLTQtMTkKICogICAgICBBdXRob3I6IHVzZXIKICovCgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxjbGltaXRzPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2RlZmluZSBmb3JlYWNoKGUseCkgZm9yKF9fdHlwZW9mKHguYmVnaW4oKSkgZT14LmJlZ2luKCk7ZSE9eC5lbmQoKTsrK2UpCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTUFYX05fVkVSVEVYUyA9IDUwMDAwICsgMTA7CgpzdHJ1Y3QgVmVydGV4IHsKCXZlY3RvcjxWZXJ0ZXgqPiBhZGo7CglpbnQgSDsKCWludCBhbVsyXVsyXTsvL25vcm1hbCAsaWYgaW5jPwoJaW50IGNoQW1TdW1bMl07CglpbnQgYW5zOwoJaW50IGRpc3Q7Ly9kaXN0IGZyb20gcm9vdCB0byBpdAoJaW50IGFtMlsyXTsvL2l0J3MgZmF0aGVyIGNob3NlIG9yIG5vdC9vdXRzaWRlIG9mIHN1YnRyZWUgYW5kIGl0J3MgYW5jcyBhcmUgaW5jZWQKCVZlcnRleCpmYXRoZXI7Cn07CgpWZXJ0ZXggdnNbTUFYX05fVkVSVEVYU107CmludCBuVnM7CgpWZXJ0ZXgqcXVlW01BWF9OX1ZFUlRFWFNdOwoKdm9pZCByZWFkSW5wdXQoKSB7CgljaW4gPj4gblZzOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBuVnM7ICsraSkgewoJCXNjYW5mKCIlZCIsICZ2c1tpXS5IKTsKCX0KCWZvciAoaW50IGkgPSAwOyBpIDwgblZzIC0gMTsgKytpKSB7CgkJaW50IGEsIGI7CgkJc2NhbmYoIiVkJWQiLCAmYSwgJmIpOwoJCVZlcnRleCp1ID0gdnMgKyBhLCAqdiA9IHZzICsgYjsKCQl1LT5hZGoucHVzaF9iYWNrKHYpOwoJCXYtPmFkai5wdXNoX2JhY2sodSk7Cgl9Cn0KCnZvaWQgZG9CRlMoVmVydGV4KnJvb3QpIHsKCWludCBxaCA9IDAsIHF0ID0gMDsKCXF1ZVtxdCsrXSA9IHJvb3Q7Cglyb290LT5mYXRoZXIgPSAwOwoJcm9vdC0+ZGlzdCA9IDA7Cglmb3IgKDsgcWggPCBxdDspIHsKCQlWZXJ0ZXgqdSA9IHF1ZVtxaCsrXTsKCQlmb3JlYWNoKGl0ZXIsdS0+YWRqKSB7CgkJCVZlcnRleCp2ID0gKml0ZXI7CgkJCWlmICh2ID09IHUtPmZhdGhlcikKCQkJCWNvbnRpbnVlOwoJCQlxdWVbcXQrK10gPSB2OwoJCQl2LT5mYXRoZXIgPSB1OwoJCQl2LT5kaXN0ID0gdS0+ZGlzdCArIDE7CgkJfQoJfQp9CnZvaWQgd29yaygpIHsKCVZlcnRleCpyb290ID0gdnMgKyAwOwoJZG9CRlMocm9vdCk7CgoJLy9jYWxjIGFtCglmb3IgKGludCBhdCA9IG5WcyAtIDE7IGF0ID49IDA7IC0tYXQpIHsKCQlWZXJ0ZXgqdSA9IHF1ZVthdF07CgkJZm9yIChpbnQgY2YgPSAwOyBjZiA8IDI7ICsrY2YpIHsKCQkJZm9yIChpbnQgaW5jID0gMDsgaW5jIDwgMjsgKytpbmMpIHsKCQkJCWludCB2YWwgPSB1LT5IICsgaW5jOwoJCQkJaW50JnJldCA9IHUtPmFtW2NmXVtpbmNdOwoJCQkJcmV0ID0gSU5UX01BWDsKCQkJCWZvciAoaW50IGNtZSA9IDA7IGNtZSA8IDI7ICsrY21lKSB7CgkJCQkJaWYgKCFjZiAmJiAhY21lKQoJCQkJCQljb250aW51ZTsKCQkJCQlpbnQgdG1wID0gY21lID8gdmFsIDogMDsKCQkJCQlmb3JlYWNoKGl0ZXIsdS0+YWRqKSB7CgkJCQkJCVZlcnRleCp2ID0gKml0ZXI7CgkJCQkJCWlmICh2ID09IHUtPmZhdGhlcikKCQkJCQkJCWNvbnRpbnVlOwoJCQkJCQl0bXAgKz0gdi0+YW1bY21lXVswXTsKCQkJCQl9CgkJCQkJcmV0ID0gbWluKHJldCwgdG1wKTsKCQkJCX0KCQkJfQoJCX0KCQlmb3IgKGludCBjID0gMDsgYyA8IDI7ICsrYykgewoJCQl1LT5jaEFtU3VtW2NdID0gMDsKCQkJZm9yZWFjaChpdGVyLHUtPmFkaikgewoJCQkJVmVydGV4KnYgPSAqaXRlcjsKCQkJCWlmICh2ID09IHUtPmZhdGhlcikKCQkJCQljb250aW51ZTsKCQkJCXUtPmNoQW1TdW1bY10gKz0gdi0+YW1bY11bMF07CgkJCX0KCQl9Cgl9CgoJLy9jYWxjIGFtMgoJcm9vdC0+YW0yWzBdID0gMDsKCXJvb3QtPmFtMlsxXSA9IDA7Cglmb3IgKGludCBpID0gMTsgaSA8IG5WczsgKytpKSB7CgkJVmVydGV4KnUgPSBxdWVbaV07CgkJZm9yIChpbnQgY2YgPSAwOyBjZiA8IDI7ICsrY2YpIHsKCQkJaW50JnJldCA9IHUtPmFtMltjZl07CgkJCXJldCA9IElOVF9NQVg7CgkJCWZvciAoaW50IGNnID0gMDsgY2cgPCAyOyArK2NnKSB7CgkJCQlpZiAoIWNnICYmICFjZikKCQkJCQljb250aW51ZTsKCQkJCWludCB0bXAgPSAwOwoJCQkJaWYgKGNmKSB7CgkJCQkJaWYgKHUtPmZhdGhlciAhPSB2cykKCQkJCQkJdG1wICs9IHUtPmZhdGhlci0+SCArIDE7CgkJCQkJZWxzZQoJCQkJCQl0bXAgKz0gdS0+ZmF0aGVyLT5IOwoJCQkJfQoJCQkJdG1wICs9IHUtPmZhdGhlci0+YW0yW2NnXTsKCQkJCXRtcCArPSB1LT5mYXRoZXItPmNoQW1TdW1bY2ZdOwoJCQkJdG1wIC09IHUtPmFtW2NmXVswXTsKCQkJCXJldCA9IG1pbihyZXQsIHRtcCk7CgkJCX0KCQl9CgkJLy8JCWNvdXQgPDwgdS0+YW0yWzBdIDw8ICIgIiA8PCB1LT5hbTJbMV0gPDwgZW5kbDsKCX0KCgkvL2NhbGMgYW5zCglmb3IgKGludCBpID0gMDsgaSA8IG5WczsgKytpKSB7CgkJVmVydGV4KnUgPSBxdWVbaV07CgkJaW50JnJldCA9IHUtPmFuczsKCQlyZXQgPSBJTlRfTUFYOwoJCWZvciAoaW50IGNmID0gMDsgY2YgPCAyOyArK2NmKSB7CgkJCWludCB0bXAgPSAwOwoJCQl0bXAgKz0gdS0+YW0yW2NmXTsKCQkJaWYgKHUgPT0gdnMpCgkJCQl0bXAgKz0gdS0+YW1bY2ZdWzBdOwoJCQllbHNlCgkJCQl0bXAgKz0gdS0+YW1bY2ZdWzFdOwoJCQlyZXQgPSBtaW4ocmV0LCB0bXApOwoJCX0KCX0KCgkvL291dHB1dAoJZm9yIChpbnQgaSA9IDA7IGkgPCBuVnM7ICsraSkgewoJCWludCBhbnMgPSB2c1tpXS5hbnM7CgkJYW5zICs9IG5WcyAtIDE7CgkJYW5zICo9IDI7CgkJYW5zIC09IHZzW2ldLmRpc3Q7CgkJcHJpbnRmKCIlZFxuIiwgYW5zKTsKCX0KfQoKdm9pZCBwcmVwYXJlKCkgewoJZm9yIChpbnQgaSA9IDA7IGkgPCBuVnM7ICsraSkgewoJCXZzW2ldLkggLT0gdnNbaV0uYWRqLnNpemUoKTsKCX0KfQoKdm9pZCBzb2x2ZSgpIHsKCXJlYWRJbnB1dCgpOwoJcHJlcGFyZSgpOwoJd29yaygpOwp9CgppbnQgbWFpbigpIHsKCXNvbHZlKCk7Cn0K