?

11  •  1个月前


#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;
}

评论:

请先登录,才能进行评论