加权重心(换根DP)

题目

换根DP,手推一下即可。

代码如下:

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
#define MAXN 100010
using namespace std;

int N, A, B, L, C, minn = 0x3f3f3f3f3f3f3f3f, size[MAXN], dp[MAXN];
vector<pair<int, int>> tree[MAXN];

void dfs1(int u, int pa) {
    size[u] = tree[u][0].first;
    for (int i = 1; i < (int) tree[u].size(); i++) {
        int v = tree[u][i].first, w = tree[u][i].second;
        if (v == pa)
            continue;
        dfs1(v, u);
        size[u] += size[v];
        dp[u] += dp[v] + size[v] * w;
    }
}

void dfs(int u, int pa) {
    for (int i = 1; i < (int) tree[u].size(); i++) {
        int v = tree[u][i].first, w = tree[u][i].second;
        if (v == pa)
            continue;
        dp[v] = dp[u] - size[v] * w + (size[1] - size[v]) * w;
        dfs(v, u);
    }
}

signed main () {
    scanf("%lld", &N);
    for (int i = 1; i <= N; i++) {
        scanf("%lld", &C);
        tree[i].push_back({C, 0});
    }
    for (int i = 1; i < N; i ++) {
        scanf("%lld%lld%lld", &A, &B, &L);
        tree[A].push_back({B, L});
        tree[B].push_back({A, L});
    }
    dfs1(1, 0);
    dfs(1, 0);
    for (int i = 1; i <= N; i++) {
        minn = min(minn, dp[i]);
    }
    printf("%lld", minn);
}
相关推荐
辰烨chenye4 小时前
LeetCode Hot 100 题解 · 普通数组篇
算法·leetcode·职场和发展
hqyjzsb7 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
辰烨chenye7 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
微功夫信息技术7 小时前
分层多智能体强化学习驱动的非急救转运公平 - 效率统一调度系统研究与实践
人工智能·学习·算法·动态规划
sanjiaomao3338 小时前
从论文公式到Python实现:用单元测试校验滑动平均算法
python·算法·单元测试
Keven_118 小时前
算法札记:ACM适用的很骚的C++语法(持续更新)
开发语言·c++
乐迪信息8 小时前
如何通过AI防爆摄像机精准判断船舶超速?
大数据·人工智能·算法·安全·目标跟踪
mengzhi啊8 小时前
QPluginLoader 动态 DLL 插件版,支持插件之间通信,广播。请求和应答
c++·qt
大圣编蚕9 小时前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法
小玮看世界10 小时前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法