P1122 最大子树和

题目描述

小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题。一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题。于是当日课后,小明就向老师提出了这个问题:

一株奇怪的花卉,上面共连有 n 朵花,共有 n−1 条枝干将花儿连在一起,并且未修剪时每朵花都不是孤立的。每朵花都有一个"美丽指数",该数越大说明这朵花越漂亮,也有"美丽指数"为负数的,说明这朵花看着都让人恶心。所谓"修剪",意为:去掉其中的一条枝条,这样一株花就成了两株,扔掉其中一株。经过一系列"修剪"之后,还剩下最后一株花(也可能是一朵)。老师的任务就是:通过一系列"修剪"(也可以什么"修剪"都不进行),使剩下的那株(那朵)花卉上所有花朵的"美丽指数"之和最大。

老师想了一会儿,给出了正解。小明见问题被轻易攻破,相当不爽,于是又拿来问你。

输入格式

第一行一个整数 n (1≤n≤16000)。表示原始的那株花卉上共 n 朵花。

第二行有 n 个整数,第 i 个整数表示第 i 朵花的美丽指数。

接下来 n−1 行每行两个整数 a,b,表示存在一条连接第 a 朵花和第 b 朵花的枝条。

输出格式

一个数,表示一系列"修剪"之后所能得到的"美丽指数"之和的最大值。保证绝对值不超过 2147483647。

输入输出样例

输入 #1

复制代码
7
-1 -1 -1 1 1 1 0
1 4
2 5
3 6
4 7
5 7
6 7

输出 #1

复制代码
3

树形dp


cpp 复制代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<set>
#include<map>
#include<unordered_set>
#include<unordered_map>
#include<bitset>
#include<tuple>
#define inf 72340172838076673
#define int long long
#define endl '\n'
#define F first
#define S second
#define  mst(a,x) memset(a,x,sizeof (a))
using namespace std;
typedef pair<int, int> pii;

const int N = 200086, mod = 998244353;

int n, m;
int h[N], e[N], ne[N], idx;
int f[N];
int res = -inf;

void add(int a, int b) {
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx++;
}

void dfs(int u, int fa) {

    for (int i = h[u]; ~i; i = ne[i]) {
        int son = e[i];
        if (son == fa) continue;
        dfs(son, u);
        f[u] += max(0ll, f[son]);
        res = max(res, f[u]);
    }
}

void solve() {
    mst(h, -1);
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> f[i];
    
    for (int i = 1; i < n; i++) {
        int a, b;
        cin >> a >> b;
        add(a, b);
        add(b, a);
    }
    
    dfs(1, -1);
    cout << res << endl;
    
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    
    int T = 1;
// cin >> T;
    while (T--) solve();
    
    return 0;
}
相关推荐
KaMeidebaby5 分钟前
卡梅德生物技术快报|纳米抗体技术全套实操流程:AFB1 全合成文库淘选 + 分子对接定点突变参数手册
人工智能·python·tcp/ip·算法·机器学习
2601_962851741 小时前
计算机毕业设计之基于YOLOV10的低光照目标检测算法研究与实现
大数据·算法·yolo·目标检测·信息可视化·cnn·课程设计
magicwt1 小时前
快手自动出价论文GAVE阅读笔记
算法
智者知已应修善业1 小时前
【P12159蓝桥杯数组翻转】2025-4-24
c语言·c++·经验分享·笔记·算法·蓝桥杯
小巧的砖头2 小时前
使用SVN+CruiseControl+ANT实现持续集成之一
学习·算法
人道领域2 小时前
【LeetCode刷题日记】贪心算法理论与实战:455.分发饼干最优解
java·开发语言·数据结构·算法·leetcode·贪心算法
小O的算法实验室2 小时前
2026年ACM TCH,动态救护车路径优化:结合 K-means 聚类与多目标粒子群算法两阶段策略
算法
在书中成长2 小时前
HarmonyOS 小游戏《对战五子棋》开发第8篇 - GomokuEngine核心引擎设计(三):五子连珠判定算法
算法·华为·harmonyos
Let's Chat Coding3 小时前
MAC 消息认证码:同时验证来源和完整性
算法·哈希算法
cc.ChenLy5 小时前
算法从入门到精通实战指南
算法