#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 5;
int n;
struct Edge {
int to, nxt;
}e[N << 1];
int h[N], cnt[N], son[N], rt, tot;
double ans = -1e18;
double a[N], f[N], g[N];
bool flag_leaf[N];
void add(int u, int v) {
e[++ tot].to = v;
e[tot].nxt = h[u];
h[u] = tot;
}
void init(int u, int fa) {
for(int i = h[u]; i; i = e[i].nxt) {
int v = e[i].to;
if(v == fa) continue;
init(v, u);
cnt[u] += cnt[v], f[u] += f[v];
}
f[u] += (a[u] * (flag_leaf[u] ? (cnt[u] = 1) : cnt[u]));
}
void dfs(int u, int fa) {
for(int i = h[u]; i; i = e[i].nxt) {
int v = e[i].to;
if(v == fa) continue;
if(flag_leaf[v]) g[v] = g[u] - a[u] + a[v] * (cnt[rt] - 2);
else g[v] = g[u] - a[u] * cnt[v] + a[v] * (cnt[rt] - cnt[v]);
dfs(v, u);
}
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
cin >> n;
for(int i = 1; i < n; i ++) {
int u, v;
cin >> u >> v;
add(u, v), add(v, u);
son[u] ++, son[v] ++;
}
for(int i = 1; i <= n; i ++) {
cin >> a[i];
if(son[i] > 1) rt = i;
else flag_leaf[1] = true;
}
init(rt, 0), g[rt] = f[rt], dfs(rt, 0);
for(int i = 1; i <= n; i ++) {
ans = max(ans, g[i] / (cnt[rt] - flag_leaf[i]));
}
printf("%.6lf\n", ans);
return 0;
}
不知道为什么样例输出 6.000000。