当前位置: 首页 > news >正文

蓝桥杯 9.生命之树

生命之树

原题目链接

题目描述

在 X 森林里,上帝创建了生命之树。

他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值。

上帝要在这棵树内选出一个节点集 S,使得对于 S 中任意两个点 a, b,都存在一个点列:

a, v1, v2, …, vk, b

使得这个点列中的每个点都是 S 里面的元素,且序列中相邻两个点之间有一条边相连。

在这个前提下,上帝希望 S 中所有节点的整数和尽量大。

这个最大的和就是上帝给生命之树的评分。

注意:集合 S 可以为空。


输入描述

  • 第一行一个整数 n,表示这棵树有 n 个节点。
  • 第二行 n 个整数,依次表示每个节点的评分。
  • 接下来 n-1 行,每行两个整数 u, v,表示存在一条 u 到 v 的边。

保证:

  • 1 <= n <= 100000
  • 每个节点的评分的绝对值不超过 1000000

输出描述

输出一行一个整数,表示上帝给这棵树的最大评分。


输入输出样例

输入

5
1 -2 -3 4 5
4 2
3 1
1 2
2 5

输出

8

c++代码

#include<bits/stdc++.h>
#include<stdio.h>using namespace std;typedef long long ll;ll n, a, b, ans = 0;
vector<ll> trees, dp, know;
vector<vector<ll>> edges;void dfs(ll root) {know[root] = 0;dp[root] += trees[root];for (ll x : edges[root]) {if (!know[x]) continue;dfs(x);if (dp[x] > 0) dp[root] += dp[x];}ans = max(ans, dp[root]);
}int main() {scanf("%lld", &n);edges = vector<vector<ll>>(n + 1);trees = vector<ll>(n + 1, 0), dp = vector<ll>(n + 1, 0), know = vector<ll>(n + 1, 1);for (ll i = 1; i <= n; i++) scanf("%lld", &trees[i]);for (ll i = 0; i < n - 1; i++) {scanf("%lld %lld", &a, &b);edges[a].push_back(b);edges[b].push_back(a);}dfs(1);cout << ans;return 0;
}//by wqs

思路解析

题目的意思就是要我们找一颗子树,使得这颗子树的权值和最大。

相关文章:

  • 深入理解 JavaScript 的 typeof 运算符:返回的数据类型
  • 2024ICPC网络赛第二场题解
  • 个人介绍网站设计
  • Charles 抓包入门教程
  • 事件绑定tips
  • 【MySQL专栏】MySQL数据库表的内外连接
  • 连接远程服务器
  • Golang | 集合求交
  • 中国科学院大学计算机考研历年初试分数线分析以及计算机所考的科目有哪些?
  • apple提包的最佳时间是月初和月末
  • 学习笔记2(Lombok+算法)
  • 互联网大厂Java面试:从Spring Boot到微服务架构的实践与挑战
  • 【上位机——MFC】文档
  • Java基础——排序算法
  • Nacos-SpringBoot 配置无法自动刷新问题排查
  • 高德地图 API 拿到当前定位和目的地址转经纬度,实现路径规划
  • Matlab算例运行
  • 数据库关系模型的总结
  • 5、Rag基础:RAG 专题
  • Golang | 向倒排索引上添加删除文档
  • 从“网点适老化”到“社区嵌入式”,“金融为老上海模式”如何探索?
  • 持续更新丨伊朗官员:港口爆炸事件已致5人死亡
  • 外卖价格、速度哪家强?记者实测美团、饿了么、京东三大平台
  • 重新认识中国女性|婚姻,古代传统家庭再生产的根本之道
  • 内蒙古纪检干部刘占波履新呼和浩特,曾参与涉煤腐败倒查20年工作
  • 第三款在美获批的国产PD-1肿瘤药来了,影响多大?