洛谷题单指南-图论之树-P2052 [NOI2011] 道路修建
原题链接:https://www.luogu.com.cn/problem/P2052
题意解读:计算所有“路径权值*两边子树大小之差的绝对值 ”之和。
解题思路:一次DFS即可解决,与求树的重心相似,不断在dfs过程中计算以当前节点为根的子树大小,记录父节点以及父节点到当前节点的路径权值,即可求得每一个路径的贡献,累加即可。
100分代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
struct Node
{
int v, w;
};
vector<Node> g[N];
int sz[N]; //sz[i]表示以i为根的子树大小
long long ans;
int n;
//u:当前节点 p:父节点 p->u的路径权值
void dfs(int u, int p, int w)
{
sz[u] = 1;
for(auto item : g[u])
{
int v = item.v;
int w = item.w;
if(v == p) continue;
dfs(v, u, w);
sz[u] += sz[v];
}
ans += 1ll * abs((n - sz[u]) - sz[u]) * w;
}
int main()
{
cin >> n;
int u, v, w;
for(int i = 1; i < n; i++)
{
cin >> u >> v >> w;
g[u].push_back({v, w});
g[v].push_back({u, w});
}
dfs(1, 0, 0);
cout << ans;
}
浙公网安备 33010602011771号