通过 DFS 算出每棵子树大小,累加每条边的边权 × 子树点数 × 剩余点数,求出树上所有点对路径长度总和。
#include<bits/stdc++.h>
using namespace std;
vector<pair<int, int>> g[1000086];
int d[1000086], n;
long long sum;
// dfs 遍历树,计算子树大小+统计总路径和
void dfs(int u, int f) {
d[u] = 1; // 当前节点自己算1个点
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i].first;
long long w = g[u][i].second; // 边权 w
if (v == f) continue; // 不回头走父节点
dfs(v, u); // 递归处理子树
d[u] += d[v]; // 累加子树大小
sum += w * abs(d[v] - n + d[v]);
// 累加答案
}
}
int main() {
cin>>n;
for (int i = 1; i < n; i++) {
int x, y, z;
cin >> x >> y >> z;
g[y].push_back({x, z});
g[x].push_back({y, z});
}
dfs(1, -1);
cout << sum; // 输出所有点对的路径长度之和
return 0;
}
752

被折叠的 条评论
为什么被折叠?



