树的最大独立集

对于一棵有N个结点的无根树,选出尽量多的结点,使得任何两个结点均不相邻(称为最大独立集)。

输入

第1行:1个整数N(1 <= N <= 6000),表示树的结点个数,树中结点的编号从1..N

接下来N-1行,每行2个整数u,v,表示树中的一条边连接结点u和v

//树的最大独立集
//对于一棵n个节点的无根树,选出尽量多的节点,使得任意两个节点均不相邻
//对于每个节点,只有两种决策,选与不选
//如果选了当前节点,则不能再选其儿子节点,只能选孙子节点
//如果不选该节点,则能选其儿子节点
//d[i]表示在当前节点时的最大独立集的节点数
//s[i]表示对i节点所有孩子的求和
//gs[i]表示对i节点所有孙子的求和
//f[i]表示i节点的父亲
//则d[i]=max(s[i],gs[i]+1);
//这里使用刷表法
//每次计算出一个d[i],就用s[i]和gs[i]加上d[i]
//由于树无根,所以我们要自行构造树
#include <iostream>
#include <algorithm>
#include <memory.h>
#include <vector>
using namespace std;
const int maxn=100+10;
vector<int> v[maxn];
int d[maxn],s[maxn],gs[maxn],f[maxn];
int n;
int dfs(int n,int fa){//以u节点为根,生成有根树f[n]=fa;//构造树for(int i=0;i<v[n].size();i++)if(fa!=v[n][i])dfs(v[n][i],n);//避免再次访问父亲节点d[n]=max(s[n],gs[n]+1);if(f[n]!=-1){s[f[n]]+=d[n];if(f[f[n]]!=-1)gs[f[f[n]]]+=d[n];}
}
int main() {int ans=0;cin>>n;for(int i=0;i<=n;i++)v[i].clear();for(int i=0;i<n-1;i++){int a,b;cin>>a>>b;v[a].push_back(b);v[b].push_back(a);}for(int i=0;i<n;i++) {memset(d,0, sizeof(d));memset(s,0, sizeof(s));memset(gs,0, sizeof(gs));memset(f,-1, sizeof(f));dfs(i,-1);ans=max(ans,d[i]);}cout<<ans<<endl;
}
/*80 11 40 20 31 55 65 7ans=5*/

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

  1. 洛谷P1156 垃圾陷阱 题解浅谈刷表法与填表法

    洛谷P1156 垃圾陷阱 题解&浅谈刷表法与填表法 填表法 :就是一般的动态规划,当前点的状态,可以直接用状态方程,根据之前点的状态推导出来. 刷表法:由当前点的状态,更新其他点的状态.需要注 ...

  2. 刷表法 和 填表法(DP)

    刷表法 和 填表法 在dp问题中,当我们写出了状态转移方程的时候,一般可以直接去迭代求解. 但是,与此同时有一个问题:例如 状态转移方程 是dp[i][j]=F{dp[i-1][j-1],dp[i-1 ...

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

    树的最大独立集 对于一颗n个结点的无根树,选出尽量多的的结点,使得任何两个结点均不相邻(称为最大独立集),然后输入n-1条无向边,输出一个最大独立集(如果有多解,则任意输出一组). 分析: 用d(i) ...

  4. c++ 不撞南墙不回头——树形动态规划(树规)

    不撞南墙不回头--树规总结                                         焦作一中信息学oy 之所以这样命名树规,是因为树规的这一特殊性:没有环,dfs是不会重复,而 ...

  5. 不撞南墙不回头——树形动态规划(树规)

    不撞南墙不回头--树规总结                                         焦作一中信息学oy 之所以这样命名树规,是因为树规的这一特殊性:没有环,dfs是不会重复,而 ...

  6. 对LCA、树上倍增、树链剖分(重链剖分长链剖分)和LCT(Link-Cut Tree)的学习

    LCA what is LCA & what can LCA do LCA(Lowest Common Ancestors),即最近公共祖先 在一棵树上,两个节点的深度最浅的公共祖先就是 L ...

  7. Java中的查找树和哈希表(一级)

    下面我们来看一下JAVA中有哪些查找树和哈希表,我们分两块内容来讲呗,第一块我们首先来讲查找树,第二块我们来讲哈希表,JAVA里面我们有一个TreeSet,还有一个TreeMap,他们底层都是使用了红 ...

  8. 旅游(树形dp求树的最大独立集)

    链接:https://ac.nowcoder.com/acm/problem/15748 来源:牛客网 题目描述 Cwbc和XHRlyb生活在s市,这天他们打算一起出去旅游. 旅行地图上有n个城市,它 ...

  9. BZOJ 2588: Spoj 10628. Count on a tree 树上跑主席树

    2588: Spoj 10628. Count on a tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/J ...

最新文章

  1. 经典4大Python面试题!初级者,你所需知的(附标准答案)-上篇
  2. 游戏服务器正式发布时动态库处理的两种策略
  3. 【CodeForces - 827A】String Reconstruction(并查集合并区间,思维)
  4. DuiVision开发教程(19)-菜单
  5. springmvc工作流程_SpringMVC工作原理
  6. 攻城掠地sdk服务器没有响应,攻城掠地没落的原因及对策
  7. java rmi 安全管理器_Java:没有安全管理器:RMI类加载器被禁用
  8. linux tr 命令_在Linux中使用tr命令玩角色
  9. DPDK分析——UIO
  10. mysql查询忽略字符编码是什么_MySQL 查询不区分大小写的问题以及编码格式问题...
  11. 韦东山第3期嵌入式Linux项目-视频监控-2-从零写USB摄像头驱动(UVC驱动)
  12. 汽车电工及电子技术基础【3】
  13. hp服务器pe系统安装win7系统教程,惠普星 x360 u盘重装win7图文教程
  14. 生成和查看dump文件
  15. [kubernetes]-weave scope初体验
  16. Navicat Premium使用手册
  17. 内容算法解读:提高内容摘要与原文的一致性(Faithfulness)
  18. 关于电脑使用墨墨背单词使用键盘操作问题
  19. 分页的php处理,分页处理的PHP类
  20. 032_smallpdf

热门文章

  1. 史上最全的中高级JAVA工程师-面试题汇总
  2. 云南高性能云桌面搭建解决方案、云桌面与传统PC优势对比,云桌面适用场景分析
  3. 回顾使用云桌面的那些经验
  4. 逍遥魔兽mysql_隆重推出【逍遥魔兽V837】端带全新一键端工具
  5. 面向对象之反射,元类
  6. clip studio paint插件开发之介绍
  7. 数据库设计 - 01外卖配送系统
  8. 解决Could not build wheels for pikepdf which use PEP 517 and cannot be installed directly
  9. 用jQuery实现9宫格抽奖
  10. linux sd卡 分区变大,Linux下使用fdisk命令将高容量SD卡(SDHC)格成两个分区