首页 > 其他分享 >洛谷 P1122 最大子树和

洛谷 P1122 最大子树和

时间:2024-06-16 15:11:08浏览次数:28  
标签:子树 洛谷 int dfs edge 为根 P1122 节点

题目链接:最大子树和



思路

       由于可以无限剪枝,所以假设以节点1为根,并删去所有美丽质数小于0的子树,又考虑到可能会出现根节点为负数,导致可能会只留下子树而把节点1为根节点的其他部分扔掉,所以需要dp数组记录,dp[i]为以节点i为根节点能得到的最大的美丽指数,贪心将节点i的子树中所有美丽指数之和小于0的子树全部丢掉。由于dp是从简单的问题推导出复杂的问题,所以需要先解决叶子节点,先dfs搜索再求结果。然后找出以每个节点为根节点得到的最大美丽指数中的最大值就是答案。


题解

#include <bits/stdc++.h>
using namespace std;
const int N = 2e4;
#define ll long long

ll n, beautiful[N], f[N];
vector<int> edge[N];

void dfs(int x, int fa) {
  f[x] = beautiful[x];
  int len = edge[x].size();
  for (int i = 0; i < len; i++) {
    if (edge[x][i] == fa)
      continue;
    dfs(edge[x][i], x);
    if (f[edge[x][i]] > 0) {
      f[x] += f[edge[x][i]];
    }
  }
}

int main() {
  cin >> n;

  for (int i = 1; i <= n; i++) {
    cin >> beautiful[i];
  }

  for (int i = 1; i < n; i++) {
    int a, b;
    cin >> a >> b;
    edge[a].push_back(b);
    edge[b].push_back(a);
  }

  dfs(1, 0);

  ll res = - 2147483647;
  for (int i = 1; i <= n; i++) {
    res = max(res, f[i]);
  }

  cout << res << endl;
  return 0;
}

标签:子树,洛谷,int,dfs,edge,为根,P1122,节点
From: https://www.cnblogs.com/againss/p/18250631

相关文章

  • 洛谷 P1162 填涂颜色
    题目链接:填涂颜色思路代码#include<bits/stdc++.h>usingnamespacestd;constintN=30+10;#definelllonglongintmp[N][N],dir[5][2]={{1,0},{0,1},{-1,0},{0,-1}},n;boolvis[N][N];boolcheck(intx,inty){returnx>=......
  • 洛谷 P1216 数字三角形
    题目链接:数字三角形思路    dp:金字塔顶的元素为起点,金字塔每行的最左侧数字只能从上一层的最左侧数字到达,如7->3->8->2->4,这些数字中的每一个(除起点7外)都只能从上一层的最左侧数字到达,递推公式为dp[i][1]=max(dp[i][1],num[i][1]+dp[i-1][1],最右侧数字......
  • 洛谷 P4343 自动刷题机
    题目链接:自动刷题机思路    二分典题,两个二分判断出可能的最大值和最小值。需要注意当删掉y行代码后,当前代码行数小于0时需要将代码行数重新赋值为0,然后需要注意二分的n最大值的边界,因为x[i]的最大值为1e9,日志最多有1e5行,所以考虑极限情况,日志每一行都是写了1e9行代码,......
  • 洛谷 P1226 快速幂
    题目链接:快速幂思路    简单快速幂模板。a^17=(a^2)^8*a,此时pow()中的y就可以视为17->8(y>>=1),pow()中的x就是底数a->a^2(x*=x),结果res可以视为在循环时多出来的后边乘的a,1->a(res*=x),简单代数推导就会发现y=1的时候,会有res*=x此时的x为a^16,则......
  • 洛谷 P5595 歌唱比赛
    题目链接:歌唱比赛思路    根据题目分析可得,假如小x的点赞数是123111,小y的点赞数是234111,则字符串的第4为到第6位结果都为Z,分别为对比(111,111),(11,11),(1,1),字符串的第三位为Y,为对比(3111,4111),则结果字符串为YYYZZZ。    此时可以轻易判断出字符串中第一个Z后面的所有字母......
  • 洛谷P8807 [蓝桥杯 2022 国 C] 取模
    题目:解读(思路与分析):题目总结:对于给定的整数n和范围m,要找到两个不同的x和y,它们除以n后的余数相等。思路:对于每组给出的n,m询问,可以通过遍历范围从1到m的所有可能的j,并计算n对j取模的余数。使用一个集合来存储已经出现过的余数,如果当前余数已经存在于集......
  • 洛谷 P2015 二叉苹果树
    题目链接:二叉苹果树思路    本题使用链式向前星存储树上的边,然后DFS搜索+简单dp。    dp数组,dp[i][j]表示节点i及其子树保留k根树枝得到的最大苹果数。son数组存储当前节点的孩子节点的编号和当前节点与孩子节点之间的树枝上的苹果个数。    对于dp递......
  • 洛谷 P1352 没有上司的舞会
    题目链接:没有上司的舞会思路题解#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconstintN=1e5+10;intdp[N][2],happy[N],subordinate[N],cnt,head[N],nex[N],edge[N];//链式向前星存储边voidadd(intx,inty){nex[++cnt]=......
  • 洛谷 P1219 八皇后
    题目链接:八皇后思路    这是一个典型的搜索题目,从前往后依次枚举行数,从第一行开始依次枚举皇后的纵坐标,并判断当前坐标是否满足题目要求,满足题目要求则标记将答案存储,并继续向下枚举下一行。由分析可得每条对角线上的任意一点的横纵坐标满足公式i-j+n的值与对角......
  • 洛谷P1601 A+B Problem(高精)
    #include<iostream>#include<string>#include<cstring>#include<cstdio>usingnamespacestd;constintN=1005;structbign{intlen,s[N];bign(){memset(s,0,sizeof(s));len=1;}bign(intnum){*this=num;}......