11 • 8个月前
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
struct Edge {
int u, v, cost;
};
int n;
vector<vector<pair<int, int>>> graph;
vector<int> subtree_size;
int calculateSubtreeSize(int node, int parent) {
subtree_size[node] = 1;
for (auto& neighbor : graph[node]) {
int next_node = neighbor.first;
if (next_node == parent) continue;
subtree_size[node] += calculateSubtreeSize(next_node, node);
}
return subtree_size[node];
}
long long calculateTotalCost() {
long long total_cost = 0;
for (int node = 1; node <= n; ++node) {
for (auto& neighbor : graph[node]) {
int next_node = neighbor.first;
int cost = neighbor.second;
if (subtree_size[next_node] < subtree_size[node]) {
total_cost += cost * abs(n - 2 * subtree_size[next_node]);
}
}
}
return total_cost;
}
int main() {
cin >> n;
graph.resize(n + 1);
subtree_size.resize(n + 1);
for (int i = 0; i < n - 1; ++i) {
int a, b, c;
cin >> a >> b >> c;
graph[a].emplace_back(b, c);
graph[b].emplace_back(a, c);
}
calculateSubtreeSize(1, -1);
long long result = calculateTotalCost();
cout << result << endl;
return 0;
}
评论:
请先登录,才能进行评论