Wa了,悬赏一关!
查看原帖
Wa了,悬赏一关!
878013
_Supernova楼主2023/11/19 13:34
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5, inf = 0x3f3f3f3f;
typedef long long ll;
int N, Ai, Bi, Li, ans, all;
int c[maxn], dp[maxn], siz[maxn], dep[maxn];
struct edge {
	int to, cost;
} h;
vector <edge> e[maxn];
void dfs1(int now, int f) {
	siz[now] = c[now];
	for (int i = 0; i < e[now].size(); ++i) {
		int v = e[now][i].to, w = e[now][i].cost;
		if (v == f) {
			continue;
		}
		dep[v] = dep[now] + w;
		dfs1(v, now);
		siz[now] += siz[v];
	}
	return ;
}
void dfs2(int now, int f) {
	for (int i = 0; i < e[now].size(); ++i) {
		int v = e[now][i].to, w = e[now][i].cost;
		if (v == f) {
			continue;
		}
		dp[v] = dp[now] - siz[now] * w + (all - siz[now]) * w;
		dfs2(v, now);
	}
	return ;
}
int main(void) {
	scanf("%d", &N);
	for (int i = 1; i <= N; ++i) {
		scanf("%d", &c[i]);
		all += c[i];
	}
	for (int i = 1; i < N; ++i) {
		scanf("%d %d %d", &Ai, &Bi, &Li);
		h.to = Bi, h.cost = Li;
		e[Ai].push_back(h);
		h.to = Ai;
		e[Bi].push_back(h);
	}
	dfs1(1, 0);
	for (int i = 1; i <= N; ++i) {
		dp[1] += c[i] * dep[i];
	}
	dfs2(1, 0);
	ans = inf;
	for (int i = 1; i <= N; ++i) {
		ans = min(ans, dp[i]);
	}
	printf("%d", ans);
    return 0;
}
2023/11/19 13:34
加载中...