首页 > 其他分享 >最大子树和(树形dp)

最大子树和(树形dp)

时间:2023-09-23 17:13:51浏览次数:33  
标签:子树 int tree dfs 树形 long include 节点 dp

  • 题意

题目链接:https://www.luogu.com.cn/problem/P1122

给一棵树,树上的每个节点都有一个值,然后你可以剪掉一些节点,问最后你能得到的最大的和。(因为有些节点的值为负数。)

  • 思路

典型树形dp。跑一遍dfs就行。
从 1 开始搜,f[i] 代表以 i 为根节点往下能得到的最大值,然后我们从 1 开始搜,如果 f[u] > 0,那么就说明这个子树不需要修剪,直接加上就行了。反之,不加。思路非常简单。

  • 代码

#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<math.h>
#include<stack>
#include<map>
#include<list>
#include<unordered_set>
#include<unordered_map>
#define endl '\n';
//#define int long long;
using namespace std;
typedef long long ll; 
const int N = 2e4+10;
int n, m, k;
int val[N], f[N];
vector<int> tree[N];

void dfs(int u, int fa){
    f[u] = val[u];
    for (auto t : tree[u]){
        if (t != fa){
            dfs(t, u);
            if (f[t] > 0)f[u] += f[t];
        }
    }
    return;
}

void sovle(){
    cin >> n; 
    for (int i = 1; i <= n; i ++)cin >> val[i];
    for (int i = 1; i <= n-1; i ++){
        int x, y;
        cin >> x >> y;
        tree[x].push_back(y);
        tree[y].push_back(x);
    }
    dfs(1, 0);
    int ans = -1000000;
    for (int i = 1; i <= n; i ++){
        ans = max(ans, f[i]);
    }

    cout << ans << endl;
}

int main()
{	
    int t = 1; 
    //scanf("%d", &t);
    
    while (t --){
        sovle();
    }

    return 0;
}



标签:子树,int,tree,dfs,树形,long,include,节点,dp
From: https://www.cnblogs.com/Shunn/p/17724717.html

相关文章

  • 落基山脉(区间dp)
    题意题目链接:https://www.luogu.com.cn/problem/P9325给一段山脉的高度,然后从中截取一段长度为i的区间,求最小不对称值。不对称值就是这段区间里,最左边的高度与最右边的高度的差值加上倒数第二和第二,……。然后输出区间长度从1到n的最小不对称值。思路很容易想到......
  • P7916 [CSP-S 2021] 交通规划 sol-最短路+环形dp
    P7916[CSP-S2021]交通规划solStatement传送门Solution好题。发现\(k\le2\)的分值非常多,于是我们考虑从\(k=2\)入手。颜色相同就不用说了,直接染成同一种颜色就行了。我们考虑其他情况,就是颜色不相同的情况,我们一定是找了一条路径把这个图给切开了就像这个样子。......
  • 学不会的动态规划——状压DP
    前言不知道为什么越是接近网络赛就越是静不下心来,可能也是因为开学了吧,QAQ,有一说一还是暑假比较适合训练。第一场网络赛,特意选了一个属于我们队的“风水宝地”(其实是我们去的早获得了优先选择权),但是好像并没有什么用,读题读巨慢,还被签到卡了2h(大概,有点不记得了),最后开j,队友推公式写......
  • Exam DP-300: Administering Microsoft Azure SQL Solutions 微软Azure SQL Solutions
    作为该考试的考生,您应具备构建数据库解决方案方面的主题专业知识,这些解决方案旨在支持使用数据库构建的多种工作负载:企业内部SQLServerAzureSQL服务您是一名数据库管理员,负责管理使用SQLServer和AzureSQL服务构建的内部部署和云数据库。作为Azure数据库管理员,您......
  • 小白也能看懂的插件化DroidPlugin原理(三)-- 如何拦截startActivity方法
    **前言:**在前两篇文章中分别介绍了动态代理、反射机制和Hook机制,如果对这些还不太了解的童鞋建议先去参考一下前两篇文章。经过了前面两篇文章的铺垫,终于可以玩点真刀实弹的了,本篇将会通过Hook掉startActivity方法的一个小例子来介绍如何找出合适的Hook切入点。开始之前我们......
  • # github.com/coreos/etcd/clientv3/balancer/resolver/endpoint
    linux使用go连接etcd集群时报错:#github.com/coreos/etcd/clientv3/balancer/resolver/endpoint/root/go/pkg/mod/github.com/coreos/[email protected]+incompatible/clientv3/balancer/resolver/endpoint/endpoint.go:114:87:undefined:resolver.BuildOption/root/go/pkg/mod/g......
  • kubernetes初始化时报错:CRI v1 runtime API is not implemented for endpoint \"unix
    近日,进行Kubernetes初始化时报错如下:[root@k8s-master~]#kubeadminit--kubernetes-version=v1.28.2--pod-network-cidr=10.244.0.0/16--service-cidr=10.96.0.0/12--apiserver-advertise-address=10.10.10.185[init]UsingKubernetesversion:v1.28.2[preflight]Runn......
  • PHP多层级菜单树形结构递归处理
    如题:一、数据库菜单数据表使用图片中id和parent_id两个参数来关联父子关系二、将数据库中的数据变成树状多层级解构```{ "id":1, "parentId":0, "treePath":"0", "name":"系统管理", "type":2, "path":"/system",......
  • 升级UBUNTU 18.04时出现DPKG错误
    报错:dpkg:errorprocessingpackageca-certificates-uniontech(--configure):解决:sudodpkg--configure-a  参考:升级UBUNTU18.04时出现DPKG错误 ......
  • TCP vs UDP:揭秘可靠性与效率之争
    概述今天我们开始主要讲解TCP的相关知识点。在之前讲解分层章节的时候,我们提到过一个重要观点。在网络层及以下几层,更多的是让主机与主机建立连接,也就是说你的电脑需要知道另一台电脑在哪里才能连接上它。然而,在网络中的通信往往是进程间的通信,而不是机器间的通信。因此,TCP协议引......