奶牛集会(换根dp)
2025-09-14 15:44:31
发布于:北京
奶牛集会(换根dp)
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct node {
	int v, w;
};
int n;
int s[100005];
int dp[100005];
vector<node> mp[100005];
void dfs1(int x, int fa) {
	for (int i = 0; i < mp[x].size(); i++) {
		int y = mp[x][i].v;
		int w = mp[x][i].w;
		if (y != fa) {
			dfs1(y, x);
			s[x] += s[y];
			dp[x] += dp[y] + s[y] * w;
		}
	}
}
void dfs2(int x, int fa) {
	for (int i = 0; i < mp[x].size(); i++) {
		int y = mp[x][i].v;
		int w = mp[x][i].w;
		if (y != fa) {
			dp[y] = dp[x] - s[y] * w + (s[1] - s[y]) * w;
			dfs2(y, x);
		}
	}
}
signed main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> s[i];
	}
	for (int i = 1; i < n; i++) {
		int x, y, w;
		cin >> x >> y >> w;
		mp[x].push_back({y, w});
		mp[y].push_back({x, w});
	}
	dfs1(1, -1);
	dfs2(1, -1);
	int minn = 1e18;
	for (int i = 1; i <= n; i++) {
		minn = min(minn, dp[i]);
	}
	cout << minn;
	return 0;
}
这里空空如也











有帮助,赞一个