mx 树型 dp 求调
查看原帖
mx 树型 dp 求调
526017
COsm0s楼主2024/1/3 20:21
#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.0000006.000000。

2024/1/3 20:21
加载中...