它为啥能 Hack 这种 DP?
#include <bits/stdc++.h>
#define rep(i, j, k) for(int i = j; i <= k; ++i)
#define pb push_back
using namespace std;
const int N = 1e5 + 5;
double dp[N][2], k;
int n, m, u, v, p[N], s, t, ans, f;
vector<int> e[N];
int fa[N];
int get(int x) {
return x == fa[x] ? x : fa[x] = get(fa[x]);
}
void merge(int x, int y) {
fa[get(x)] = get(y);
}
void dfs(int u, int fa) {
dp[u][0] = 0, dp[u][1] = p[u];
for(auto v : e[u]) {
if(v == fa)
continue;
dfs(v, u);
dp[u][0] += max(dp[v][0], dp[v][1]);
dp[u][1] += dp[v][0];
}
}
signed main() {
// ios::sync_with_stdio(0);
// cin.tie(nullptr), cout.tie(nullptr);
cin >> n;
rep(i, 1, n) cin >> p[i], fa[i] = i;
rep(i, 1, n) {
cin >> u >> v, ++u, ++v;
if(get(u) == get(v) && !s) {
s = u, t = v;
continue;
}
merge(u, v), e[u].pb(v), e[v].pb(u);
}
cin >> k;
dfs(s, 0), dfs(t, 0);
printf("%.1lf", max(dp[s][0], dp[t][0]) * k);
}