首页 > 其他分享 >luoguP2015 二叉苹果树

luoguP2015 二叉苹果树

时间:2024-11-03 15:42:19浏览次数:1  
标签:std luoguP2015 int 二叉 -- vector 苹果树 节点 dp

给定一棵N个节点的苹果树,根节点编号为1。如果树枝有分叉,一定是分二叉。已知节点a与b的边权为w[a][b]。求一棵树,最多有Q条边,并且边权之和最大。
1<=Q<N<=100; 0<=w[i][j]<=3E4

分析:Q条边的树对应Q+1个节点,转化为节点数限制,可以用树上背包的方法来做。记dp[x][j]表示以x为根,选择节点数不超过j的最大权值之和,对于节点x,如果要选其子节点i,那么必须选上x,可以枚举子节点的节点数进行递推。

#include <bits/stdc++.h>
using i64 = long long;

void solve() {
    int N, Q;
    std::cin >> N >> Q;
    std::vector<std::vector<int>> adj(N);
    std::vector<std::vector<int>> w(N, std::vector<int>(N));
    for (int i = 1; i < N; i++) {
        int x, y, z;
        std::cin >> x >> y >> z;
        x--, y--;
        w[x][y] = w[y][x] = z;
        adj[x].push_back(y);
        adj[y].push_back(x);
    }

    std::vector<std::vector<int>> dp(N, std::vector<int>(Q + 2));

    auto dfs = [&](auto self, int x, int p) -> void {
        for (int i = 1; i <= Q + 1; i++) {
            dp[x][i] = w[x][p];
        }
        for (auto i : adj[x]) if (i != p) {
            self(self, i, x);
            for (int j = Q + 1; j >= 1; j--) {
                for (int k = 0; k < j; k++) {
                    dp[x][j] = std::max(dp[x][j], dp[i][k] + dp[x][j - k]);
                }
            }
        }
    };

    dfs(dfs, 0, 0);
    std::cout << dp[0][Q + 1] << "\n";
}

int main() {
    std::cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

标签:std,luoguP2015,int,二叉,--,vector,苹果树,节点,dp
From: https://www.cnblogs.com/chenfy27/p/18523510

相关文章

  • P3780 苹果树 题解
    传送门夏天近了,又到了恋爱的季节,小Q家门前的苹果树上结满了红红圆圆的苹果。这株苹果树是一个有着\(n\)个结点的有根树,其中结点被依次编号为\(1\)至\(n\)。\(1\)号结点为根,其余每一个结点的父结点一定是某个编号较小的结点。每一个结点上都有一些苹果,第\(i\)个结点上有\(a_i(a_......
  • 动态动态规划 & 全局平衡二叉树 小记
    估计这几天是正式学习ddp,所以特写笔记。DDP简介是这样一类技巧,利用广义的矩阵乘法实现单点修改权值,动态查询某个点的DP值关于矩阵乘法,广义矩阵乘法其核心思想是利用矩阵乘法具有结合律(可以使用数据结构维护)的优势序列上的Ddp先看一个例子:最大子段和,显然我们有\(f_......
  • 【数据结构】二叉树链式结构的实现
    1.前置说明    在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究......
  • 【C++】——高效构建与优化二叉搜索树
    活着就意味必须要做点什么,请好好努力。——村上春树《地下》目录1、二叉搜索树BST1.1什么是二叉搜索树1.2BST的性能功能分析2、二叉搜索树的实现2.1BST框架2.2BST插入2.3BST搜索2.4BST删除2.5BST细节问题3、二叉搜索树遍历3.1中序遍历3.2前序遍历3.3......
  • JAVA 二叉树面试题
    @目录摘要代码Node节点main函数问题1:递归——求二叉树的最大深度问题2:求二叉树的最小深度问题3:求二叉树中节点的个数问题4:求二叉树中叶子节点的个数问题5:求二叉树中第k层节点的个数,不是求第k层叶子节点个数问题6:判断两棵树是否相同问题7:给定一个二叉树,检查它是否是镜像对称的。问......
  • 数据结构与算法(二叉树)
    鲸饮未吞海,剑气已横秋。 前言  这是我学习数据结构的第五份笔记,有关二叉树的知识。后期我会继续将数据结构知识的笔记补全。 上一期笔记有栈与列队,没看过的同学可以去看看:有关栈与列队的笔记https://blog.csdn.net/hsy1603914691/article/details/143064674?spm=10......
  • C语言数据结构之二叉树(BINARY TREE)链式存贮的简单实现
    C语言数据结构之二叉树(BINARYTREE)链式存贮的简单实现树型数据结构在应用中非常多,效率也非常好,只是结构相对复杂,理解起来有点儿难度!!!定义数据结构typedefstruct_BTreeNodeBTreeNode;struct_BTreeNode{intval;BTreeNode*lchild,*rchild;};自定义结构体数......
  • 二叉查找树知识简记
    二叉查找树( BST)一、概念1、简述一种能够将链表插入的灵活性和有序数组查找的高效性结合起来的符号表实现。具体来说,就是使用每个结点含有两个链接(链表中每个结点只含有一个链接)的二叉查找树来高效地实现符号表2、特点(1)在二叉查找树中,每个结点还包含了一个键和一个值,键之......
  • 二叉树专题学习
    前言:由于二叉树这一章的题型比较多,涉及到的递归程序也较多,所以单开一个随笔来记录这个学习过程,希望对读者有帮助。理论知识基础在二叉树的选择题中,常常会涉及到对于最多或最少结点、最大或最小高度、求叶子结点个数这几类经典的问题。上机题1.二叉树的建立和遍历P1305新二......
  • 108-二叉树-将有序数组转换为二叉搜索树
    树|二叉搜索树|数组|分治|二叉树二叉搜索树(BinarySearchTree,简称BST)和平衡二叉搜索树(BalancedBinarySearchTree)是计算机科学中非常重要的数据结构,广泛应用于各种算法和系统中。理解它们的定义、特点和性质对于掌握数据结构和算法至关重要。下面,我们将详细......