生命之树

生命之树

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

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

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

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

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

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

「输入格式」

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

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

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

「输出格式」

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

「样例输入」

1 -2 -3 4 5

2

1

2

5

「样例输出」

「数据范围」

对于 30% 的数据,n <= 10

对于 100% 的数据,0 < n <= 10^5, 每个节点的评分的绝对值不超过 10^6 。

资源约定:

峰值内存消耗(含虚拟机) < 256M

CPU消耗 < 3000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。

注意:主类的名字必须是:Main,否则按无效代码处理。

对于此题,首先重点在于题意的理解:上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都存在一个点列 {a, v1, v2, …, vk, b} 使得这个点列中的每个点都是S里面的元素,且序列中相邻两个点间有一条边相连。 其中,是对于S中任意两点a,b,存在(看清楚,是存在)一个点列,满足题意要求。

对于实例数据,选择点集S = {1,2,4,5},可知1,2直接相连,2,4和2,5都是直接相连,对于4,5存在点列{4,2,5}满足题意。所以,此题要求我们在给定树的情况下,寻找一颗子树,其所有顶点的和谐值和最大。

import java.util.ArrayList;
import java.util.Scanner; public class Main{
public static int[] nodeValue; //存放各个顶点的和谐值
public static ArrayList<Integer>[] edge; //存放各个顶点包含邻接边
public static int[] value; //用于存放某个顶点为根节点情况下,对于和谐值的和
public static int max = 0; //用于记录最终输出结果最大值 public static void dfs(int node, int father) {
value[node] = nodeValue[node];//节点node为根节点,刚开始和谐值和为节点本身和谐值
for(int i = 0;i < edge[node].size();i++) {
int son = edge[node].get(i); //节点node的孩子节点
if(son == father) //如果遍历到son为根节点时,son的孩子发现为node时,排除
continue;
dfs(son, node); //DFS搜索
if(value[son] > 0)
value[node] += value[son]; //回溯计算父母连带子节点的和谐值和
max = Math.max(max, value[node]);
}
} @SuppressWarnings("unchecked")
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
nodeValue = new int[n + 1];
for(int i = 1;i <= n;i++) {
int a = in.nextInt();
nodeValue[i] = a;
}
edge = new ArrayList[n + 1];
value = new int[n + 1];
for(int i = 1;i <= n;i++)
edge[i] = new ArrayList<Integer>();
for(int i = 1;i <= n - 1;i++) {
int a = in.nextInt();
int b = in.nextInt();
edge[a].add(b);
edge[b].add(a);
}
dfs(1, -1);//从顶点1开始DFS搜索,设置顶点1的父母节点为-1,即设置顶点1为树的根节点
System.out.println(max);
}
}

java实现第六届蓝桥杯生命之树的更多相关文章

  1. java实现第六届蓝桥杯居民集会

    居民集会 蓝桥村的居民都生活在一条公路的边上,公路的长度为L,每户家庭的位置都用这户家庭到公路的起点的距离来计算,第i户家庭距起点的距离为di. 每年,蓝桥村都要举行一次集会.今年,由于村里的人口太多 ...

  2. java实现第六届蓝桥杯切开字符串

    切开字符串 Pear有一个字符串,不过他希望把它切成两段. 这是一个长度为N(<=10^5)的字符串. Pear希望选择一个位置,把字符串不重复不遗漏地切成两段,长度分别是t和N-t(这两段都必 ...

  3. java实现第六届蓝桥杯四阶幻方

    四阶幻方 把1~16的数字填入4x4的方格中,使得行.列以 及两个对角线的和都相等,满足这样的特征时称 为:四阶幻方. 四阶幻方可能有很多方案.如果固定左上角为1 ,请计算一共有多少种方案. 比如: ...

  4. java实现第六届蓝桥杯表格计算

    表格计算 某次无聊中, atm 发现了一个很老的程序.这个程序的功能类似于 Excel ,它对一个表格进行操作. 不妨设表格有 n 行,每行有 m 个格子. 每个格子的内容可以是一个正整数,也可以是一 ...

  5. java实现第六届蓝桥杯穿越雷区

    穿越雷区 题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能 ...

  6. java实现第六届蓝桥杯密文搜索

    密文搜索 福尔摩斯从X星收到一份资料,全部是小写字母组成. 他的助手提供了另一份资料:许多长度为8的密码列表. 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的. 请你编写一个程序,从第一份资料 ...

  7. java实现第六届蓝桥杯奇怪的数列

    奇怪的数列 从X星截获一份电码,是一些数字,如下: 13 1113 3113 132113 1113122113 - YY博士经彻夜研究,发现了规律: 第一行的数字随便是什么,以后每一行都是对上一行& ...

  8. java实现第六届蓝桥杯奇妙的数字

    奇妙的数字 奇妙的数字 小明发现了一个奇妙的数字.它的平方和立方正好把0~9的10个数字每个用且只用了一次. 你能猜出这个数字是多少吗? 请填写该数字,不要填写任何多余的内容. 结果:69 impor ...

  9. java实现第六届蓝桥杯循环节长度

    循环节长度 两个整数做除法,有时会产生循环小数,其循环部分称为:循环节. 比如,11/13=6=>0.846153846153..... 其循环节为[846153] 共有6位. 下面的方法,可以 ...

随机推荐

  1. MySQL 入门(5):复制

    摘要 在这篇文章中,我将从MySQL为什么需要主从复制开始讲起,然后会提到MySQL复制的前提,bin log. 在这里会说明三种格式的bin log分别会有什么优缺点. 随后会讲到主从延迟方面的问题 ...

  2. Spark aggregateByKey函数

    aggregateByKey与aggregate类似,都是进行两次聚合,不同的是后者只对分区有效,前者对分区中key进一步细分 def aggregateByKey[U: ClassTag](zero ...

  3. 「雕爷学编程」Arduino动手做(30)——光敏二极管模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(动手做)的理念,以学习和交流为目的,这里准备逐 ...

  4. Java集合类: Set、List、Map

    Set.List.Map都是集合接口   set --其中的值不允许重复,无序的数据结构   list   --其中的值允许重复,因为其为有序的数据结构   map--成对的数据结构,健值必须具有唯一 ...

  5. Python 如何随机打乱列表(List)排序

    场景: 现在有一个list:[1,2,3,4,5,6],我需要把这个list在输出的时候,是以一种随机打乱的形式输出. 专业点的术语:将一个容器中的数据每次随机逐个遍历一遍. 注意:不是生成一个随机的 ...

  6. BZOJ1010单调性DP优化

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 10707  Solved: 4445[Submit][S ...

  7. 技术大佬:我去,你竟然还不会用 this 关键字

    上一篇文章写的是 Spring Boot 的入门,结果有读者留言说,Java 都还没搞完,搞什么 Spring Boot,唬得我一愣一愣的.那这篇就继续来搞 Java,推出广受好评的我去系列第四集:你 ...

  8. 解决 appium 当中 uiautomator2 无法启动的问题

    在启动 appium 程序中,有时候会出现 uiautomator2 服务无法启动的错误,appium 的日志截图如下: image.png 错误信息: ActivityManager: Unable ...

  9. ## 0521Day04内部类

    [重点] Math公式 静态导入 正则表达式 内部类 访问修饰符 [Math] Math包的相关方法: round:四舍五入:-10.9==>-11/-11.2==>-11 floor:向 ...

  10. Python中出现 SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 12-13: truncated \UXXXXXXXX escape

    Python中出现 SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 12-13: t ...