蓝桥杯第131题——生命之树

2024-03-31 16:04
文章标签 蓝桥 生命 131 之树

本文主要是介绍蓝桥杯第131题——生命之树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

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

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

上帝要在这棵树内选出一个非空节点集 S,使得对于 S 中的任意两个点 a,b,都存在一个点列 a,v1​,v2​,⋯,vk​,b 使得这个点列中的每个点都是 S 里面的元素,且序列中相邻两个点间有一条边相连。

在这个前提下,上帝要使得 S 中的点所对应的整数的和尽量大。

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

经过 atm 的努力,他已经知道了上帝给每棵树上每个节点上的整数。但是由于 atm 不擅长计算,他不知道怎样有效的求评分。他需要你为他写一个程序来计算一棵树的分数。

输入描述

第一行一个整数 n 表示这棵树有 n 个节点。

第二行 n 个整数,依次表示每个节点的评分。

接下来 n−1 行,每行 2 个整数 u,v,表示存在一条 u 到 v 的边。由于这是一棵树,所以是不存在环的。

其中,0 < n ≤ 10^5, 每个节点的评分的绝对值不超过 10^6。

输出描述

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

输入输出样例

示例

输入

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

输出

8

 解题思路

这道题说的很复杂,其实就是在一个无向图中寻找一组互相连接的节点,找到其权值最大的组合。

这是一道经典的树形dp,树形dp是结合dfs与递推计算的解题手法,用于在树和图的结构中进行递推计算,该题就是一个经典的应用场景。

我们定义dp[i]表示以节点 i 为根的树能达到的最高权值;如果与节点 i 相连的节点的dp值是正值,则可以将其加入到该点的dp值中。

本来其实任意寻找一个节点开始进行dfs即可,这里提供一个技巧,由于我们是进行dfs搜索,那么只需要以1为根开始dfs,将所有连线都定义为小号节点到大号节点的有向连线,考虑到计算大号节点dp值的时候小号节点的dp值还没有正确计算出来,所以dfs并不需要考虑节点号比其小的节点。

import java.util.*;public class Main {static int n;static long[] dp;static int[] w;static ArrayList<ArrayList<Integer>> tree;static long ans = 0;public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();w = new int[n + 1];dp = new long[n + 1];tree = new ArrayList<>();tree.add(new ArrayList<>());for (int i = 1; i <= n; i++) {w[i] = sc.nextInt();dp[i] = w[i];tree.add(new ArrayList<>());}for (int i = 0; i < n - 1; i++) {int a = sc.nextInt();int b = sc.nextInt();tree.get(Math.min(a, b)).add(Math.max(a, b));}dfs(1);System.out.println(ans);}public static void dfs(int root) {for (int i = 0; i < tree.get(root).size(); i++) {int son = tree.get(root).get(i);dfs(son);if (dp[son] > 0) {dp[root] += dp[son];}}ans = Math.max(ans, dp[root]);}
}

这篇关于蓝桥杯第131题——生命之树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/864728

相关文章

使用Python实现生命之轮Wheel of life效果

《使用Python实现生命之轮Wheeloflife效果》生命之轮Wheeloflife这一概念最初由SuccessMotivation®Institute,Inc.的创始人PaulJ.Meyer... 最近看一个生命之轮的视频,让我们珍惜时间,因为一生是有限的。使用python创建生命倒计时图表,珍惜时间

C语言蓝桥杯

一、语言基础 竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_s

created生命周期函数获取不到vuex数据解决方法

问题:在created中获取vuex数据,然后去后端请求数据,发现获取的vuex数据不存在。 解决方法:使用watch监听vuex数据,当数据发生变化在去后端请求数据

生命在于运动

程序员和设计师大部分时间都坐在电脑前。有效的锻炼有助于他们更好地工作。 传统的: 当坐在电脑桌前的时候 脚触地。双手在肘部弯曲。打字时手应搁在桌子上。键盘和鼠标应在触手可及的地方。显示屏应在视线水平上,不高不低。光线最好应来自上方。即光线应该从天花板上照下来。每隔20分钟远眺。可降低眼睛长时间盯着近距离物体产生的疲劳。鼠标和手差不多大小。使用全尺寸符合人体工学的键盘。我个人比较喜欢Mi

找不同-第15届蓝桥省赛Scratch初级组真题第4题

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第183讲。 如果想持续关注Scratch蓝桥真题解读,可以点击《Scratch蓝桥杯历年真题》并订阅合集,查阅教程更方便。 第15届蓝桥杯省赛已于2024年8月24日落下帷幕,编程题一共有5题,分别如下: 猪八戒落地 游乐场 画西瓜 找不同 消

【蓝桥杯嵌入式(一)程序框架和调度器】

蓝桥杯嵌入式(一)程序框架和调度器 序、代码命名规则零、STM32和8051⼀、软件及环境安装⼆、⼯程框架搭建1.时钟配置2、SYS配置3、⼯程配置4、NVIC配置5.、Keil配置 三、系统初始化四、任务调度器 链接: 视频出处 序、代码命名规则 以下是一些常见的举例 零、STM32和8051 链接: 8位和32位单片机最本质区别 ⼀、软件及环境安装

【蓝桥杯嵌入式(二)Led、Key、Lcd】

蓝桥杯嵌入式(二)Led、Key、Lcd 五、Led模块1.原理图配置2. 知识点3.底层代码 六、Key模块1.原理图配置2.知识点3.底层代码底层代码(四⾏代码版本)底层代码(状态机版本) 七、LCD模块1.原理图配置2.知识点底层代码 五、Led模块 1.原理图配置 2. 知识点 链接: 上拉电阻的通俗解释 链接: 单⽚机怎么输出⾼电平!推挽输出和开

蓝桥杯:整数删除

// 蓝桥杯整数删除.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include<stdio.h>#define MAX 100void findmin(int a[],int n,int& pos){int min=a[0];pos=0;//pos=0我开始忘了,特别注意

第十五届蓝桥杯图形化省赛题目及解析

第十五届蓝桥杯图形化省赛题目及解析 一. 单选题 1. 运行以下程序,角色会说( )? A、29     B、31     C、33     D、35 正确答案:C 答案解析: 重复执行直到m>n不成立,即重复执行直到m<=n。所有当m小于或者 等于n时,循环结束。循环过程中变量m与变量n的变化如下表: 通过上述表格可知,循环到第五次循环结束。m的值为14,n的值为19

第八届蓝桥杯 最大公共子串(动态规划)

标题:最大公共子串 最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少。 比如:"abcdkkk" 和 "baabcdadabc", 可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。 下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。 请分析该解法的思路,并补全划线部分缺失的代码。 #include <stdio.h