洛谷题单指南-图论之树-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;
}

 

posted @ 2025-03-11 17:49  hackerchef  阅读(35)  评论(0)    收藏  举报