#include using namespace std; const int MaxN = 1e5 + 10; int n, a[MaxN], who[MaxN]; double b[MaxN], upb[MaxN][2]; bool can; vector < int > g[MaxN]; int getWho(int v) { return who[v] == v ? v : who[v] = getWho(who[v]); } void dfsUp(int v, int p) { upb[v][1] = upb[v][0] = -1e+40; vector < double > chld, rchld; for (auto to : g[v]) { if (to == p) { continue; } dfsUp(to, v); if (upb[to][0] < 0) { chld.push_back(upb[to][1]); } else { rchld.push_back(upb[to][1]); } } sort(rchld.rbegin(), rchld.rend()); if ((int)chld.size() >= 3) { can = false; return; } if ((int)chld.size() == 2) { if (chld[1] + chld[0] + b[v] < 0) { can = false; return; } upb[v][0] = chld[1] + chld[0] + b[v]; upb[v][1] = 0; return; } if ((int)chld.size() == 1) { upb[v][0] = b[v] + chld[0] + (rchld.size() > 0 ? max(0.0, rchld[0]) : 0.0); upb[v][1] = b[v] + chld[0]; } if ((int)chld.size() == 0) { upb[v][1] = max(upb[v][1], b[v] + (rchld.size() > 0 ? max(0.0, rchld[0]) : 0)); upb[v][0] = b[v]; upb[v][0] += (rchld.size() > 0 ? max(0.0, rchld[0]) : 0); upb[v][0] += (rchld.size() > 1 ? max(0.0, rchld[1]) : 0); } if (upb[v][0] < upb[v][1]) { upb[v][0] = upb[v][1]; } if (p == 0) { can &= (upb[v][0] >= 0); } } bool check(double x) { for (int i = 1; i <= n; ++i) { b[i] = a[i] - x; } can = true; srand(time(NULL)); dfsUp(rand() % n + 1, 0); return can; } void solve() { scanf("%d", &n); assert (1 <= n && n <= 100000); int maxA = 0; for (int i = 1; i <= n; ++i) { scanf("%d", &a[i]); assert (1 <= a[i] && a[i] <= 100000); maxA = max(maxA, a[i]); who[i] = i; } for (int i = 1; i < n; ++i) { int x, y; scanf("%d%d", &x, &y); assert (1 <= x && x <= n); assert (1 <= y && y <= n); assert (getWho(x) != getWho(y)); who[getWho(x)] = getWho(y); g[x].push_back(y); g[y].push_back(x); } for (int i = 1; i <= n; ++i) { assert (getWho(i) == getWho(1)); } double l = 1e-6, r = maxA; for (int it = 0; it < 60; ++it) { double m = (l + r) / 2; // cerr << ' ' << l << ' ' << r << '\n'; if (check(m)) { l = m; } else { r = m; } } for (int i = 1; i <= n; ++i) { g[i].clear(); } printf("%.9lf\n", (l + r) / 2.0); } int main() { // freopen("input.txt", "r", stdin); int t; scanf("%d", &t); assert (1 <= t && t <= 20); while (t --> 0) { solve(); } return 0; }