树上的动态规划学习5 - 树的最大独立集

11.动态规划:树形DP问题、树上最大独立集、树上最小支配集、换根DP、树上倍增(LCA)【灵神基础精讲】 来源0x3f:https://space.bilibili.com/206214 阅读详情

树的最大独立集的意思就是说,对于一棵n个节点的树(G=<V,E>),选出尽量多的点组成一个集合,使得该集合的任何两个点没有边相连。


解法1: 用二维数组d[u][k]表示以u为根的子树中,选(k=1)或不选(k=0)u所得到的最大独立集的节点的个数。注意,这里必须用二维数组,单单用一个d[u]会混淆选或不选两种情形。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

#define N 1000000+10
vector<int> G[N];
int p[N];
int n;
void read_tree()
{
    int u, v;
    cin>>n;
    for (int i = 0; i < n - 1; i++)
    {
        cin>>u>>v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
}

void dfs(int u, int father)
{
    for (int i = 0; i < G[u].size(); i++)
    {
        if (G[u][i] != father) { //加此判断,防止无限递归。
            p[G[u][i]] = u;
            dfs(G[u][i], u);
        }
    }
}

int d[N][2] = {0};
int dp(int u, int k, int father) {
    d[u][k]=k;
    for (int i=0; i<G[u].size(); i++) {
        if (G[u][i]!=father) {
            if (k) {
                d[u][k]+=dp(G[u][i], 0, u);
            }else {
                d[u][k]+=max(dp(G[u][i], 0, u), dp(G[u][i], 1, u));
            }
        }
    }
    return d[u][k];
}

int main()
{
    read_tree();
    int root;
    cin >> root;
    p[root] = -1;
    dfs(root, -1);
    for (int i = 0; i < n; i++)
        cout << p[i] << ' ';
    cout<<endl;

    cout<<max(dp(root, 0, -1), dp(root, 1, -1));
    return 0;

}

注意:

1)任选一个节点做根,将无根树转有根树即可。不需要将每个节点都类似处理一遍(选一个做根就可以了)。我们选的根不一样,所生成的最大独立集所包含的节点可能不一样,但节点个数一定是一样的。
2)不过这种方法好像只能打印出最大独立集的个数,不能将最大独立集的节点都具体打印出来。要是谁有什么办法打印出具体的节点欢迎留言。

解法2: 从树的最底层开始往上遍历,采用刷表法,每次将其父节点和祖父节点更新。下次再写。

树形dp入门 目录 2.最大独立集 2.1 最大独立集的定义 独立集是指图 G 中两两互不相邻的顶点构成的集合。最大独立集是具有最大尺寸的独立集。 2.2例题 没有上司的舞会 题目链接AcWing算法基础课 285.没有上司的舞会 2.3思路 本道题是有向图,由上司指向职员。用动态数组去存储图的边。has_fa[i]表示i是否有父节点,1为有,0为没有。 构造两个状态0,1。f[i][0]表示不选择i点时,i点及其子树能得到的最大快乐指数。f[i][1]表示选择i点时,i点及其子树能得到的最大快乐指数。j为i的儿子节点 阅读详情

相关推荐

C++树形DP基础例题————— 树的最大独立集

题目描述: 对于一棵有N个结点的无根树,选出尽量多的结点,使得任何两个结点均不相邻(称为最大独立集)。 题目输入: 第1行:1个整数N(1 <= N <= 6000),表示树的结点个数,树中结点的编号从1..N 接下来N-1行,每行2个整数u,v,表示树中的一条边连接结点u和v 题目输出: 第1行:1个整数,表示最大独立集的结点个数 样例输入: 11 1 2 1 ...

C2020lax的博客 1103

树的最大独立集

树的最大独立集合:对于一颗无根树,选出尽量多的点使得任何两个结点均不相邻。 用d(i)表示以i为根结点的子树的最大独立集大小。 对于结点i,只有两种选择,选或者不选,若选,则问题转化为求出i的孙子的d值之,若不选则转化为求i的儿子的d值之和。 状态转移方程:d(i) = max(1 + gs[i], s[i]);#include <iostream> #include <vector> #in

L. 4617

树上的动态规划--树的最大独立集--刷表法

树的最大独立集     对于一棵有N个结点的无根树,选出尽量多的结点,使得任何两个结点均不相邻(称为最大独立集)。     输入     第1行:1个整数N(1 &lt;= N &lt;= 6000),表示树的结点个数,树中结点的编号从1..N     接下来N-1行,每行2个整数u,v,表示树中的一条边连接结点u和v //树的最大独立集 //对于一棵n个节点的无根树,选出尽量多的节点...

Juicewyh的博客 4012

[树形DP] 树的最大独立集

文章目录题目描述输入输出样例输入样例输出解题思路 题目描述 对于一棵有N个结点的无根树,选出尽量多的结点,使得任何两个结点均不相邻(称为最大独立集)。 输入 第1行:1个整数N(1 &amp;lt;= N &amp;lt;= 6000),表示树的结点个数,树中结点的编号从1…N 接下来N-1行,每行2个整数u,v,表示树中的一条边连接结点u和v 输出 第1行:1个整数,表示最大独立集的结点个数 样例输入 11 ...

烟尘的博客 1556

树形动态规划(最大子独立集)

最大子独立集 对于一棵有N个结点的无根树,选出尽量多的结点,使得任何两个结点均不相邻(称为最大独立集)。 输入 第1行:1个整数N(1 <= N <= 6000),表示树的结点个数,树中结点的编号从1..N 接下来N-1行,每行2个整数u,v,表示树中的一条边连接结点u和v 输出 第1行:1个整数,表示最大独立集的结点个数 样例输入 11 1 2 1 3 3 4 3 5

PGQ的博客 2631

#4462. 最大权独立集问题

题意: E.Space 喜欢出最大权独立集问题。 接下来,他还想出 nnn 道最大权独立集问题。 E.Space 有 nnn 个 AI,编号为 1∼n1 \sim n1∼n 。 开始第 iii 个 AI 里面存有一道 E.Space 事先出好的一道难度为 did_idi​ 的最大权独立集问题。 AI 之间可以互相通信,对于所有的 2≤i≤n2 \le i \le n2≤i≤n ,第 iii 个 A...

sz_165394732的博客 732

树上独立集数量 树型DP

题目描述: 对于一棵树,独立集是指两两互不相邻的节点构成的集合。例如,图1有5个不同的独立集(1个双点集合、3个单点集合、1个空集),图2有14个不同的独立集,图3有5536个不同的独立集。 输入: 第一行一个正整数n,表示点的数量。n最大为100000。接下来n-1行,有两个整数a、b,表示编号为a、b的两个点之间有一条边,其中a、b大于等于1,小于等于n...

baichuan9723的博客 465

树上dp ——基环树 合集(持续更新ing)

最近在洛谷上写树上dp,遇到了一个叫基环树的东东。 蒟蒻不自量力,也来写一篇合集 吧。 什么是基环树? 基环树,也是环套树,简单地讲就是树上在加一条边。它形如一个环,环上每个点都有一棵子树的形式。因此,对基环树的处理大部分就是对树处理和对环处理。显然,难度在于后者。 一般来说,这种题目的做法都是先找到环,断开环中的任意一条边, 把它当成一般的树形DP来做。 步骤一:找环,我们可以用dfs记录前驱,标记访问状态来找环,如果搜到某点已经访问过了,说明这个访问过的点以及其前驱必在环上。 步骤二:断环,断开这条边

矮纸斜行闲作草 934

树的最小支配集,最小点覆盖与最大独立集

首先看一下三者的定义:   定义1  对于图G=(V,E)来说,最小支配集指的是从V中取尽量少的点组成一个集合,使得对于V中剩余的点都与取出来的点有边相连。也就是说,设V‘是图G的一个支配集,则对于图中的任意一个顶点u,要么属于集合V’,要么与V‘中的顶点相邻。在V’中出去任何元素后V‘不再是支配集,则支配集是极小支配集。称G的所有支配集中顶点个数最少的支配集为最小支配集,最小支配集中顶点的个数...

weixin_30470857的博客 344

CSP-J/S 复赛算法 树形动态规划

树形动态规划是一种专门用于树结构上求解最优化问题的技术,广泛应用于计算机科学中的多个领域。在CSP-J/S复赛的算法题中,树形动态规划常常被用来解决与树结构相关的复杂问题,如路径最大化、节点选择、覆盖问题等。与线性动态规划相比,树形动态规划具有更高的灵活性和适应性,能够有效地处理具有层次关系的复杂数据结构。树形动态规划的核心思想在于通过递归或深度优先搜索(DFS)的方法,从树的叶子节点开始逐层计算,利用子节点的最优解逐步推导出父节点的最优解。

m0_62599305的博客 1858

告别手动配置!用Vector vLinkGen 2.1.0自动生成AUTOSAR链接脚本(附bss段配置详解)

本文详细介绍了如何使用Vector vLinkGen 2.1.0工具自动生成AUTOSAR链接脚本,告别繁琐的手动配置。通过解析vLinkGen的核心架构和bss段配置实践,帮助开发者提升嵌入式软件开发效率,支持多种主流编译器,实现精确的内存分配和初始化策略。

weixin_28716181的博客 377

深入学习C++:什么是树状DP

树状DP是动态规划在树结构上的应用,利用树的递归特性,通过子树状态推导父节点状态。核心特点包括:依赖树结构、状态与子树相关、无后效性。基本步骤为选根、定义状态、推导转移方程、递归计算。典型应用包括最大独立集、树的直径和最小支配集问题。示例展示了二叉树抢劫问题,通过定义节点选/不选状态,后序遍历计算最优解。时间复杂度O(n),空间复杂度O(h)。

善良的小乔的博客 1413

关于Win11安装Ubuntu子系统报错:WslRegisterDistribution failed with error 解决办法

Win11安装Ubuntu子系统报错:WslRegisterDistribution failed with error

qq_51908382的博客 3万+

树的最小支配集,最小点覆盖与最大独立集 - smartyfh

首先看一下三者的定义: 定义1 对于图G=(V,E)来说, 最小支配集 指的是从V中取尽量少的点组成一个集合,使得对于V中剩余的点都与取出来的点有边相连。也就是说,设V‘是图G的一个支配集,则对于图中的任意一个顶点u,要么属于集合V’,要么与V‘中的顶点相邻。在V’中出去任何元素后V‘不再是支配集,则支配集是极小支配集。称G的所有支配集中顶点个数最少的支配集为最小支配集,最小支配集中顶点的个

Crazy_Bear 775

Zynq裸机调试RTL8211FS网卡踩坑记:从ping不通到完美兼容的完整代码修改

本文详细记录了在Zynq平台上使用Xilinx SDK(XSDK)调试RTL8211FS网卡的完整过程,从最初的ping不通问题到最终实现完美兼容的解决方案。通过分析PHY芯片的寄存器配置差异,提供了关键代码修改和调试技巧,帮助开发者快速解决类似问题。

weixin_42550597的博客 419

Windows域账户无管理员权限也能装软件?3步搞定UAC设置(附安全提醒)

本文探讨了在Windows域环境中,如何通过配置用户账户控制(UAC)实现临时提权,让无管理员权限的域账户也能安装软件。文章详细介绍了三步走策略:临时加入本地管理员组、调整UAC行为以及至关重要的权限回收,并提供了脚本化部署方案与安全实践指南,旨在平衡企业IT管理的效率与安全。

fox11的博客 756

基环树上的动态规划:从《骑士》看断环成树与两次树形DP

动态规划是算法竞赛中解决最优化问题的基础方法,其中树形DP面向树结构上的决策问题。当图中出现环时,普通树形DP的递推关系会被破坏,基环树因此成为一种值得专门研究的图结构。通过并查集识别环边并执行断环成树,再配合两次树形DP枚举断边的选择状态,就能求解最大权独立集等典型问题。这类技巧在信息学奥赛的进阶题目中十分常见,例如《骑士》就要求选手在基环树森林上完成状态转移。理解其原理不仅能解决特定题目,也能为后续学习仙人掌图等复杂结构打下基础。

weixin_32612263的博客 254

FPGA_adc采样并通过以太网发送到上位机

本项目使用FPGA-ZYNQ-7020采集8通道ADC数据,通过以太网上传到上位机显示波形PL部分包括数据的获取与处理,数据从PL传递到PSPS部分包括以太网的发送,由PL到PS的中断触发本文章不详细讲解背后原理 但保证每一步足够详细,跟着就能实现。本人FPGA平台 大磊FPGA7020开发板 vivado2020.2 vitis2020.2 匿名上位机公开版

weixin_42304868的博客 5624

树上DP:从入门到实战

树上DP(动态规划)是一类在树形结构上进行的动态规划问题。它的核心思想是:把树看作由若干子树组成的结构,通过递归地求解子树的最优解,再合并得到整棵树的最优解。树上DP通常采用深度优先搜索(DFS)的方式,自底向上地计算每个节点的状态。与普通线性DP不同,树上DP的状态转移往往发生在父节点与子节点之间。常见的状态设计方式有两种:一种是以节点为状态,记录该节点子树内的最优值;另一种是结合背包思想,在树上做分组背包。

QY8765的博客 159

Cyclone DDS背景技术

DDSI标准与DDS 1.2和1.4标准密切相关,DDSI中的实体与DCPS中的实体之间有明确的对应关系。但是,这种对应关系不是一一对应的。 此处,仅仅对DDSI规范的概念进行描述,暂不涉及Eclipse Cyclone DDS实现的细节。DDSI规范的概念将帮助对互操作性interoperability感兴趣的技术人员了解规范的外延边界和Eclipse Cyclone DDS实现的开始。

pony12的专栏 948

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

算法提高——树上DP(树的直径)

树的直径是图论里边非常高的考察点并且是入门树形dp的基础,竞赛的同学务必重视。树上最远两点(叶子结点)的距离。大臣的旅费 很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。J是T国重要大臣,他巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了J最常做的

leoyongyuan的博客 2445

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

DP树形动态规划

叶:往往是在从叶往根dfs一遍之后(相当于预处理),再重新往下获取最后的答案,即根据题目的要求需要再更新一下各结点的状态值。那么,转成一个树试试看,好像有头绪了,假设节点0为空前导课(高中毕业证),那么很明显每个人都有,我们就看看2这边怎么分析吧。做到后面,会发现树形DP的老套路都也就那么多,难的还是怎么能想出转移方程,各种DP做到最后都是这样!树形DP准确的说是一种DP的思想,将DP建立在树状结构的基础上。课程可以化成这样,数字表示最前面的前导课,字母表示课程,很显然,我们不会森林阿。

2501_93015990的博客 839

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

codeforces103389J 最大权边独立集

最大权边独立集 真的手速场了属于是,只能说运气不错没wa,金尾 来水个博客 当时开错题了,当然也有字符串不熟悉,看到 J 就有树形dp的感觉,虽然赛中细节完全想不明白,但大方向确实没错,枚举替换几条边然后树形dp什么的,就在一棵树上吊死了( 太拉了要继续加油qaq 传送门 中文题就不写题意了叭 官方题解写的很好: 枚举位于最终边独立集上的加入的边权为 p 的边的数量 t,那么 0 ≤ t ≤ k 且 2t ≤ n,这是因为每条边将占据图中的两个点。假设最终要加入 t 条边,那么需要从图中删去 2t 个

juraws的博客 773
上一篇: Leetcode-31: 31. Next Permutation
下一篇: Leetcode-1: TwoSum 两种解法 和 Leetcode-167: TwoSum-II
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值