java:结点选择

java:结点选择

考点:树形动态规划

题目

问题描述
有一棵 n 个节点的树,树上每个节点都有一个正整数权值。如果一个点被选择了,那么在树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少?

输入格式
第一行包含一个整数 n 。

接下来的一行包含 n 个正整数,第 i 个正整数代表点 i 的权值。

接下来一共 n-1 行,每行描述树上的一条边。

输出格式
输出一个整数,代表选出的点的权值和的最大值。
样例输入
5
1 2 3 4 5
1 2
1 3
2 4
2 5
样例输出
12
样例说明
选择345号点,权值和为 3+4+5 = 12 。
数据规模与约定
对于20%的数据, n <= 20。

对于50%的数据, n <= 1000。

对于100%的数据, n <= 100000。

权值均为不超过1000的正整数。

别人的详解

https://blog.csdn.net/lala__lailai/article/details/79249809

在正式介绍链式前向星之前我们先了解一下前向星:

前向星一种数据结构,以储存边的方式来存储图。构造方法如下:读入每条边的信息,将边存放在数组中,把数组中的边按照起点顺序排序,前向星就构造完了。通常用在点的数目太多,或两点之间有多条弧的时候。一般在别的数据结构不能使用的时候才考虑用前向星。除了不能直接用起点终点定位以外,前向星几乎是完美的

以上是博主百度的结果,简单来说前向星就是一种只存储边的信息(起点,终点,权重)的一种存储结构,对于图一般有两种存储结构,邻接矩阵和邻接表,对于邻接矩阵而言,花费的空间实在是太大而且会造成很大的空间浪费所以在图中的点很多的时候这种方法就没有了用武之地,而对于邻接表过程实现有点复杂…而前向星是一个比较均衡的存储结构.

链式前向星又称为邻接表的静态建表方式,其最开始确实是基于前向星,是以提高前向星的构造效率为目的设计的存储方式,最终演变成了一个变形的邻接表这一数据结构。链式前向星采用数组模拟链表的方式实现邻接表的功能(数组模拟链表的主要方式就是记录下一个节点在数组的哪个位置。),并且使用很少的额外空间,可以说是目前建图和遍历效率最高的存储方式了。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44522477/article/details/104402556