请求添加题解,解一重心本蒟蒻看不懂,故自己写了篇易懂的
  • 板块P1364 医院设置
  • 楼主xiaII
  • 当前回复4
  • 已保存回复4
  • 发布时间2025/1/3 18:59
  • 上次更新2025/1/3 19:21:48
查看原帖
请求添加题解,解一重心本蒟蒻看不懂,故自己写了篇易懂的
1548725
xiaII楼主2025/1/3 18:59
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
using ll = long long;
const int INF = 0x7ffffff;
const int N = 1e4 + 10;
vector<int>g[N];
int sum[N], maxv[N];
int n; int a, b, w[N]; int cnt; int answer;
void dfs(int u, int f) {
	int maxx = 0; sum[u] = w[u];
	for (const auto& x : g[u]) {
		if (x == f)continue;
		dfs(x, u);
		sum[u] += sum[x];
		if (sum[x] > maxx)maxx = sum[x];
	}
	if (cnt - sum[u] > maxx)maxx = cnt - sum[u];
	maxv[u] = maxx;
}
void distance(int u, int f, int dep) {
	answer += dep * w[u];
	for (const auto& x : g[u]) {
		if (x == f)continue;
		distance(x, u, dep + 1);
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> w[i] >> a >> b;
		cnt += w[i];
		if (a) {
			g[i].push_back(a);
			g[a].push_back(i);
		}
		if (b) {
			g[i].push_back(b);
			g[b].push_back(i);
		}
	}
	dfs(1, -1);
	int ans = INF; int id = 0;
	for (int i = 1; i <= n; i++) {
		if (maxv[i] < ans) {
			ans = maxv[i];
			id = i;
		}
	}
	distance(id, -1, 0);
	cout << answer;
	return 0;
}
2025/1/3 18:59
加载中...