树的最大独立集

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

任选一个结点当根,用d(i)表示以i为根结点的子树的最大独立集大小,结点i只有两种决策:选或不选。如果选了i,则i的儿子都不能选;如果不选i,那么问题转化成求i的所有儿子的d值再相加。状态转移方程:
这里写图片描述
其中s(i)和gs(i)分别是i的儿子集合与孙子集合。
实现方法:当计算出一个d(i)后,用它去更新i的父结点和祖父结点,所以每次只要记录父结点即可
poj2342 Anniversary party

#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<deque>
#include<stack>
using namespace std;
const int maxn=6000+10;

vector<int>next[maxn];
int s[maxn],gs[maxn];
int w[maxn];
int n;

int dp(int cur,int fa){
    for(int i=0;i<next[cur].size();i++){
        int x=next[cur][i];
        if(x==fa)continue;
        int d=dp(x,cur);
        s[cur]+=d;
        if(fa!=-1)gs[fa]+=d;
    }
    return max(s[cur],gs[cur]+w[cur]);
}

int main(){
    while(scanf("%d%d",&n,&w[1]),n||w[1]){
        for(int i=1;i<=n;i++)next[i].clear();
        int x,y;
        for(int i=2;i<=n;i++)
            scanf("%d",&w[i]);
        for(int i=1;i<=n-1;i++){
            scanf("%d%d",&x,&y);
            next[x].push_back(y);
            next[y].push_back(x);
        }
        memset(s,0,sizeof(s));
        memset(gs,0,sizeof(gs));
        printf("%d\n",dp(1,-1));
    }
    return 0;
}

poj3342 Party at Hali-Bula
将名字映射成数字速度快一些。
在检查答案是否唯一的时候有点麻烦。

#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<deque>
#include<stack>
using namespace std;
const int maxn=200+10;

map<string,int>id;
vector<int>next[maxn];
int s[maxn],gs[maxn];
int d[maxn];
int n;

void dp(int cur,int fa){
    for(int i=0;i<next[cur].size();i++){
        int x=next[cur][i];
        if(x==fa)continue;
        dp(x,cur);
        s[cur]+=d[x];
        if(fa!=-1)gs[fa]+=d[x];
    }
    d[cur]=max(s[cur],gs[cur]+1);
}

bool dfs(int cur,int fa){
    if(next[cur].size()==0)return true;
    if(d[cur]==s[cur]&&d[cur]==gs[cur]+1)return false;

    for(int i=0;i<next[cur].size();i++){
        int x=next[cur][i];
        if(x==fa)continue;

        if(s[cur]>gs[cur]+1){//如果取的是子节点
            if(dfs(x,cur)==false)return false;
        }
        else{//如果取的是孙子结点
            for(int j=0;j<next[x].size();j++){
                int y=next[x][j];
                if(y==cur)continue;
                if(dfs(y,x)==false)return false;
            }
        }
    }
    return true;
}

int main(){
    string peox,peoy;
    while(scanf("%d",&n),n){
        id.clear();
        for(int i=1;i<=n;i++)next[i].clear();
        int cnt=0;
        cin>>peox;
        for(int i=1;i<=n-1;i++){
            cin>>peox>>peoy;
            if(id.count(peox)==0)id[peox]=++cnt;
            if(id.count(peoy)==0)id[peoy]=++cnt;
            int x=id[peox],y=id[peoy];
            next[x].push_back(y);
            next[y].push_back(x);
        }
        memset(d,0,sizeof(d));
        memset(s,0,sizeof(s));
        memset(gs,0,sizeof(gs));
        dp(1,-1);
        printf("%d ",d[1]);

        puts(dfs(1,-1)?"Yes":"No");
    }
    return 0;
}
C++树形DP基础例题————— 树的最大独立集 题目描述: 对于一棵有N个结点的无根树,选出尽量多的结点,使得任何两个结点均不相邻(称为最大独立集)。 题目输入: 第1行:1个整数N(1 <= N <= 6000),表示树的结点个数,树中结点的编号从1..N 接下来N-1行,每行2个整数u,v,表示树中的一条边连接结点u和v 题目输出: 第1行:1个整数,表示最大独立集的结点个数 样例输入: 11 1 2 1 ... 阅读详情

相关推荐

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

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

Juicewyh的博客 4012

[图论总结] 最大独立集(例题:Code Names)

[图论总结1]最大独立集的概念独立集匹配概念之间的关系及性质例题 最大独立集的概念 独立集 PICTURE:/home/ldu/.config/tencent-qq//AppData/file//sendpix0.jpg 来自oi-wiki 在上面的描述中,V是代表的点权,而E代表的是边权 独立集以及最大独立集均是点的集合 从字面意思来说,一张图的最大独立集就是独立集中大小最大的 如果说两个点之间是独立的那么说这两个点之间就没有边相连 匹配 PICTURE:/home/ldu/.config/tencen

PushyTao的博客 1万+

K8s认证文件丢失的应急处理与恢复策略

本文详细介绍了Kubernetes(K8s)认证文件丢失时的应急处理与恢复策略。从快速诊断问题范围到不同场景的临时解决方案,再到深度恢复方案(无损重建、部分重置、完全重建),提供了全面的操作指南。同时强调了生产环境中的防丢失设计、高可用集群的特殊处理以及日常运维建议,帮助运维人员有效应对认证文件丢失的紧急情况。

weixin_33743248的博客 327

最大独立集和最大完全子图

定义 最大独立集:当且仅当对于U 中任意点u 和v所构成的边(u , v) 不是G 的一条边时,U 定义了一个空子图。当且仅当一个子集不被包含在一个更大的点集中时,该点集是图G 的一个独立集(independent set ),同时它也定义了图G 的空子图。最大独立集是具有最大尺寸的独立集(摘自:百度百科:最大独立集)。 最大完全子图:图中任意两顶点都直接相连的图,称为完全图,也称全连接图。图...

FanJin的博客 1万+

国产蓝牙MCU选型避坑指南:从汇顶到杰理,这7家厂商的实测体验

本文基于一线开发者对汇顶、泰凌微、沁恒、博通集成、奉加微、杰理、翱捷等七家主流国产蓝牙MCU厂商的实测体验,提供了一份详实的选型避坑指南。文章不仅对比了各厂商芯片的SDK质量、文档、开发工具与技术支持等“软实力”,还深入剖析了实际开发中可能遇到的功耗、射频、版本兼容性等核心痛点,并针对不同项目需求给出了具体的选型决策建议,旨在帮助工程师高效完成国产蓝牙MCU选型。

u5v6w7的博客 338

AI工具 | 每个打工人必备的15款人工智能超级工具

不过,还是有一些靠谱的人工智能平台,它们可不只是营销噱头。有些AI公司正试图改变游戏规则。人工智能工具让人们能够更聪明地工作,而不是更辛苦地劳作。如果你想知道未来有什么,那就来看看这10款人工智能工具吧,它们将彻底改变我们的工作方式。

Vampire_2017的博客 5万+

论文导读 | 最大独立集问题的求解

图的最大独立集问题(MIS problem)是图论研究中的一个重要问题,具有广泛的应用。本文介绍了最大独立集求解相关的三篇工作,包括一篇启发式方法和两篇基于学习的方法,希望能让大家对这个问题有所了解。 问题定义 一个图G(V, E)的顶点集子集I称为图G的一个独立集(independent set)是指:I中任意两点没有边相连。图G中大小最大的独立集(拥有顶点数目最多)称为图G的最大独立集(maximum indepent set,MIS)。 与独立集类似的概念还有顶点覆盖(vertex cover)

weixin_48167662的博客 9546

matplotlib保存图片设置分辨率总是96dpi,好烦躁,教你一招轻松解决

matplotlib保存图片设置分辨率总是96dpi,好烦躁,教你一招轻松解决 目录 matplotlib保存图片设置分辨率总是96dpi,好烦躁,教你一招轻松解决 #使用plt.savefig("cm.png",dpi = 300)为什么不管用 #plt.rcParams也不管用 #解决方案 在做论文的过程中,许多期刊或者会议对图片的分辨率有明确的要求,例如,dpi=300。 之前画曲线图都是采取保存方式为savefig(dpi=300),然后查看保存图片的属性信息,然而你看到的现象是

data+scenario+science+insight 8799

树的最大独立集——树形dp

树的最大独立集:对于一颗n个节点的无根树,给出n-1条遍,选出尽量多的节点,使得任何两个节点均不相邻。输出一个最大独立集 分析:     d[i]:表示以i为节点的子树的最大独立集大小。     那么对于每个节点j. 取或者不取。 取j则j的孩子不能取,不取j则j的孩子可以取;     那么问题转化成了:取节点j,求出j的所有孙子的d值之和再+1。 不取j,求出j的所有儿子的d值之

爱拼才会赢 5388

5.7 BGP属-ORIGIN

注意:当去往同一个目的地存在多条不同Origin属性的路由时,在其他条件都相同的情况下,BGP将按如Origin的下顺序优选路由:IGP > EGP > Incomplete。通过以上输出可以看到路由表选择了R3发过来的路由,因为R1的路由的起源为?通过以上输出我们可以看到针对于1.1.1.1这条路由有两条,从R1和R3传过来的起源都属于IGP。(4)把从R1传过来的路由的起源改为incomplete。通过以上输出可以看到,从R1传过来的路由是最优的。(2)在R2上查看1.1.1.1的路由详细信息。

lwljh134的博客 308

分布式计算Ray框架:从入门到精通完全教程

想象一下,你有一个机器学习模型要训练,数据集大到让你的笔记本电脑直冒烟;或者你需要并行跑几百个爬虫任务,但线程池和多进程搞得你头晕眼花。传统的单机计算已经hold不住这些场景,分布式计算应运而生。然而,传统的分布式框架(如Hadoop、Spark)要么配置复杂,要么对动态任务支持不佳。这时候,Ray闪亮登场!Ray是一个开源的分布式计算框架,专为高性能、灵活性和易用性而生。它最初由UC Berkeley的RISELab团队开发,目标是让开发者用最少的代码实现分布式任务。无论是数据处理、机器学习,还是仿真任务

大模型大数据攻城狮的专栏 1318

[树形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

【SystemVerilog基础】SystemVerilog Assertion 概述

断言主要是描述复杂的设计行为;是传统验证方法学一个很好的补充,可以检查到电路内部细节,相当于一种白盒验证,传统的验证方法学是纯粹的黑盒验证!property跟上面的sequence差别不大,唯一有差别可能多了两个implication(|->,|=>)注意,当有前置条件时,不满足前置条件不会fail,而是伪真!上面这个因为没有前置条件,每个周期都会去检查!注意:当没有前置条件时,不满足条件会直接fail!

MoorePlus的博客 332

树形DP——树的最大独立集

问题引入 树的最大独立集: 对于一棵nnn个节点的无根树,选出尽量多的节点,使得任何两个节点均不相邻,输出最大独立集的顶点个数 方法一 状态转移 设d(i,k)d(i,k)d(i,k)表示以iii为根节点,选或不选对应的最大独立集大小 d(i,0)d(i,0)d(i,0)表示该节点不选,那么下个节点可以选也可以不选,即d(i,0)+=max(d(son[i],0),d(son[i],1));{d(i,0)+=max(d(son[i],0),d(son[i],1));}d(i,0)+=max(d(son[i

Happig的博客 780

【雕爷学编程】Arduino动手做(45)---红外光电避障传感器模块4

雕爷学编程,Arduino动手做,开源硬件,创客传感器,红外光电避障传感器模块

雕爷学编程 2503

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

树的最大独立集 《算法竞赛入门经典》P171

树的最大独立集 《算法竞赛入门经典》上的一个题目,

qq943574281的专栏 676

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

树形DP:树的最大独立集

最大独立集 树的最大独立集,即树中最多的不相邻的点的集合 问题引入 描述 Cwbc和XHRlyb生活在 s 市,这天他们打算一起出去旅游。 旅行地图上有 n 个城市,它们之间通过 n-1 条道路联通。 Cwbc和XHRlyb第一天会在 s 市住宿,并游览与它距离不超过 1 的所有城市,之后的每天会选择一个城市住宿,然后游览与它距离不超过 1 的所有城市。 他们不想住在一个已经浏览过的城市,又想尽可能多的延长旅行时间。 XHRlyb想知道她与Cwbc最多能度过多少天的时光? 输入描述: 第一行,两

一只老风铃 970

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

树形动态规划之树的最大独立集

树的最大独立集 对于一颗n个结点的无根树,选出尽量多的的结点,使得任何两个结点均不相邻(称为最大独立集),然后输入n-1条无向边,输出一个最大独立集(如果有多解,则任意输出一组)。 分析: 用d(i)表示以i为根结点的子树的最大独立集的大小。此时需要注意的是,本题的树是无根的:没有所谓的父子关系,而只是一些无向边。没关系,只要任选一个跟r,无根树就变成了有根树,上述状态的定义也就有意义了。

RoundYuan 2275

C++ 树形DP入门题详解——树的最大独立集

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

qq_44013342的博客 1019

树的最大独立集(dp)

树的最大独立集合:对于一颗无根树,选出尽量多的点使得任何两个结点均不相邻   问题分析:   选择一个结点作为根节点。d(i)表示以i节点为根结点的子树的子树的最大独立子集。每个结点只有选择与不选择两种状态。     d(i,1)表示以i结点为根且选择i结点的子树的最大独立集。   d(i,0)表示以i结点为根且不选择i结点的子树的最大独立集。   结果就是选取一个点i作

NSSWTT的博客 984

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

树的最大独立集的意思就是说,对于一棵n个节点的树(G=&lt;V,E&gt;),选出尽量多的点组成一个集合,使得该集合的任何两个点没有边相连。解法1: 用二维数组d[u][k]表示以u为根的子树中,选(k=1)或不选(k=0)u所得到的最大独立集的节点的个数。注意,这里必须用二维数组,单单用一个d[u]会混淆选或不选两种情形。#include &lt;iostream&gt;#include &l...

roufoo的博客 2339

树的最大权值独立集

一棵树,每个点有一个权值,选择一个权值最大的无父子节点点集。 关键词:最小点覆盖 f[i][0]:以i为根的子树不选父节点最大权值,f[i][1]:以i为根的子树选父节点最大权值 f[u][1]+=f[v][0]; f[u][0]+=max(f[v][1],f[v][0]);

acmer的随记 3044
上一篇: 求解a^b % m
下一篇: 树的重心
FightingForFinal
博客等级 码龄11年 24粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值