D. Weight the Tree 题目链接
题意 | 简单
给你一棵树n n n 顶点编号从1 1 1 到n n n ,树是无环的连通无向图。
对于每个i i i =1 , 2 , . . . , n 1 , 2 , ... , n 1,2,...,n, 让 wi 是第i i i 个顶点的权值。如果一个顶点的权重等于其所有邻居的权重之和,则该顶点称为好顶点。
【codeforce|Codeforces Round #774 (Div. 2) D. Weight the Tree】最初,所有节点的权重都未分配。为树的每个顶点分配正整数权重,使得树中好顶点的数量最大化。如果有多种方法可以做到这一点,则必须找到一种使树中所有顶点的权重总和最小化的方法。
思路 | 树形dp
仔细读这道题是让我们求最大的独立集,且保持路径上权值最小。
那这样不是就贪心和黑白染色法,可以看下面这个例子
文章图片
这里就要用树形dp的想法,把 d p [ ] [ ] dp[][] dp[][]定义成 p a i r pair pair类型, f i r s t first first代表的是他的下面有几个好节点, s e c o n d second second代表他下面需要多少路径的权值和。
先随便找一个点 比如1 1 1 进行深搜 , d p [ x ] [ 0 ] dp[x][0] dp[x][0]代表当前不是好结点, d p [ x ] [ 1 ] dp[x][1] dp[x][1]代表当前是好结点,转移方程是d p [ x ] [ 1 ] . f i r s t + = d p [ t o ] [ 0 ] . f i r s t dp[x][1].first+=dp[to][0].first dp[x][1].first+=dp[to][0].first
如果当前不是好结点的话 就可以从相邻的好结点或者不是好节点转移过来 ,我们直接挑选更小的就好了
最后直接判断结点1 是好节点的值小还是普通结点的值小,在写一个d f s dfs dfs 往回找每个点的答案就行了
代码
#include
#include
#include
#include
#include
#include
推荐阅读
- CUMTOJ|内部收益率(二分)
- CPU底层|【CPU底层那些事(数组和指针真的一样吗()】)
- codeforces|Codeforces Round #774 (Div. 2) A-D
- linux|GNU ARM 汇编指令(转)
- Linux|Linux下ARM汇编教程
- 业界观点|深度学习崛起十年(“开挂”的OpenAI革新者)
- STAC51数据分析
- 算法测试探索与实践
- 蓝桥真题|【蓝桥真题五】带三百人训练了十天精选蓝桥真题,看看他们都练些什么(三门语言题解)