加权重心(换根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);
}
相关推荐
.格子衫.5 分钟前
033动态规划之状态压缩DP——算法备赛
算法·动态规划
ysa05103013 分钟前
c++常用自带函数用法与注意
c++·笔记·算法
带多刺的玫瑰2 小时前
Leecode#4刷题之寻找两个正序数组的中位数
java·前端·算法
土司大王2 小时前
LeetCode hot100——除了自身以外数组的乘积
数据结构·算法·leetcode
IvanCodes2 小时前
RAG 实战教程(三):向量数据库检索算法,KNN、IVF、HNSW 与 Faiss 实战
人工智能·算法·agent
阿无,2 小时前
布隆过滤器
java·算法·哈希算法
徒慕风流2 小时前
激光雷达回波信号滤波与时刻鉴别算法:原理、代码实现与仿真验证
python·算法·激光雷达
这料鬼有毒2 小时前
二刷hot100-70.爬楼梯
算法
CIO_Alliance3 小时前
AI算法系列(2)| 决策树与随机森林XGBoost:企业AI化转型中的树模型选型逻辑
大数据·人工智能·算法·决策树·系统集成·企业cio联盟·企业级ai化转型
.道阻且长.4 小时前
10.LeetCode算法习题讲解--滑动窗口--最大连续为一的个数
算法·leetcode·职场和发展