您的位置:首页 > 其它

最大权值和

2018-02-27 16:01 155 查看

一、题目

问题描述

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

第一行包含一个整数 n 。

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

接下来一共 n-1 行,每行描述树上的一条边。
输出格式
输出一个整数,代表选出的点的权值和的最大值。
样例输入
5
1 2 3 4 5
1 2
1 3
2 4
2 5
样例输出
12
样例说明
选择3、4、5号点,权值和为 3+4+5 = 12 。
数据规模与约定

对于20%的数据, n <= 20。

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

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

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


二、分析

1、设dp[i][1]为编号为i的节点被选中时的最大权值,dp[i][0]为编号为i的节点不被选中时的最大权值和。

2、通过二维数组来表示树,即tree[i][j]代表编号i的第j+1个孩子节点的编号

public class Question4 {
// dp[i][1]表示第i个节点被选中时对应的权值,否则没有被选中
public static int[][] dp = new int[100002][2];
// 用二维数组(邻接矩阵)来表示树
// tree[i][3] =num表示第i个节点的第3个孩子节点为第num个节点
public static int[][] tree = new int[100002][300];

/**
*
* @param point1
* @param point2
*/
public static void creatTree(int point1, int point2) {
int i = 0;
// 当第point1个节点为父母节点时
while (tree[point1][i] != 0)
i++; // 如果第point1个节点已经有孩子了,再增加一个孩子
tree[point1][i] = point2;// 表示第point1个节点第i+1个孩子为point2
int j = 0;
// 当第point2个节点为父母节点时
while (tree[point2][j] != 0)
j++;
tree[point2][j] = point1;// 表示第point2个节点的第j+1个孩子是point1
}

/*
* 参数satrt:开始对树进行DFS遍历的开始节点,为具体节点位置,不是节点权值 参数root:为第start个节点的直接父母节点位置,
* root=0表示根节点的父母节点
*/
public static void dfs(int start, int root) {
int child = tree[start][0]; // 第start个节点的第1个孩子节点
for (int i = 0; child != 0; i++) {
child = tree[start][i];
if (child != root) { // 防止出现start的孩子成为start的父亲情况
dfs(child, start);
// 状态转移方程
dp[start][1] += dp[child][0];
dp[start][0] += (dp[child][1] > dp[child][0] ? dp[child][1] : dp[child][0]);
}
}
}

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for (int i = 0; i < n; i++)
dp[i + 1][1] = in.nextInt();
for (int i = 0; i < n - 1; i++) {
int point1 = in.nextInt();
int point2 = in.nextInt();
creatTree(point1, point2);
}
dfs(1, 0); // 从创建的数的根节点(即第1个顶点,0表示根节点的父母节点)开始进行DFS遍历
int max = (dp[1][1] > dp[1][0] ? dp[1][1] : dp[1][0]);
System.out.println(max);
}
}


Weep no more,no sigh,nor groan,Sorrow calls no time that’s gone.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  蓝桥杯算法训练
相关文章推荐