描述

给定一颗树(边权为1),选取一个节点子集,使得该集合中任意两个节点之间的距离都大于K。求这个集合节点最多是多少

输入

第一行是两个整数N,K
接下来是N-1行,每行2个整数x,y,表示x与y有一条边

输出

1个整数表示最多的节点数

样例输入

3 1
1 2
1 3

样例输出

2

提示

测试点 N的上限 K 特征
1 15 1
2 1000 1
3 1000 1
4 100000 1
5 100000 1
6 15 2
7 1000 2
8 1000 2
9 100000 2
10 100000 2

树形dp入门题。
T=2的情况有点意思。
设当前访问第i个节点。
f[i][0]f[i][0]:i不选但i父亲选。
f[i][1]f[i][1]:不选且i父亲不选。
f[i][2]f[i][2]:i选。
显然有:
f[i][2]=1+∑vf[v][0]f[i][2]=1+∑vf[v][0]
以及:
f[i][0]=∑vf[v][1]f[i][0]=∑vf[v][1]
关键是f[i][1]f[i][1]
这个东西需要考虑儿子之间是否冲突,因此最优值的产生有两种可能:
1. 所有儿子都不选。
2. 某一个儿子选,其余不选。

因此有f[i][1]=(∑vf[v][1])+max(0,f[v][2]−f[v][1])f[i][1]=(∑vf[v][1])+max(0,f[v][2]−f[v][1])。
代码:

#include<bits/stdc++.h>
#define N 100005
using namespace std;
inline int read(){int ans=0;char ch=getchar();while(!isdigit(ch))ch=getchar();while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();return ans;
}
int first[N],n,k,cnt=0,f[N][3];
struct edge{int v,next;}e[N<<1];
inline void add(int u,int v){e[++cnt].v=v,e[cnt].next=first[u],first[u]=cnt;}
inline int max(int a,int b){return a>b?a:b;}
inline int dfs1(int p,bool k,int fa){if(f[p][k]!=-1)return f[p][k];f[p][k]=k;for(int i=first[p];i;i=e[i].next){int v=e[i].v;if(v==fa)continue;if(!k)f[p][k]+=max(dfs1(v,0,p),dfs1(v,1,p));else f[p][k]+=dfs1(v,0,p);}return f[p][k];
}
inline int dfs2(int p,int k,int fa){if(f[p][k]!=-1)return f[p][k];f[p][k]=(k==2);if(!k){for(int i=first[p];i;i=e[i].next){int v=e[i].v;if(v==fa)continue;f[p][k]+=dfs2(v,1,p);}}else if(k==1){int max1=0;for(int i=first[p];i;i=e[i].next){int v=e[i].v;if(v==fa)continue;f[p][k]+=dfs2(v,1,p);int tmp=dfs2(v,2,p)-dfs2(v,1,p);if(max1<tmp)max1=tmp;}f[p][k]+=max1;}else for(int i=first[p];i;i=e[i].next){int v=e[i].v;if(v==fa)continue;f[p][k]+=dfs2(v,0,p);}return f[p][k];
}
int main(){n=read(),k=read();for(int i=1;i<n;++i){int u=read(),v=read();add(u,v),add(v,u);}memset(f,-1,sizeof(f));if(k==1)cout<<max(dfs1(1,1,1),dfs1(1,0,1));else cout<<max(dfs2(1,1,1),dfs2(1,2,1));return 0;
}

转载于:https://www.cnblogs.com/ldxcaicai/p/9738324.html

2018.09.01 独立集(树形dp)相关推荐

  1. jzoj5814 [NOIP提高A组模拟2018.8.14] 树 树形dp

    Description 梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到 点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中 ...

  2. 2018.09.01 poj3071Football(概率dp+二进制找规律)

    传送门 概率dp简单题. 设f[i][j]表示前i轮j获胜的概率. 如果j,k能够刚好在第i轮相遇,找规律可以发现j,k满足: (j−1)>>(i−1)(j−1)>>(i−1) ...

  3. P1642 规划 01分数规划+树形DP

    $ \color{#0066ff}{ 题目描述 }$ 某地方有N个工厂,有N-1条路连接它们,且它们两两都可达.每个工厂都有一个产量值和一个污染值.现在工厂要进行规划,拆除其中的M个工厂,使得剩下的工 ...

  4. P4383 [八省联考2018]林克卡特树(树形dp+wqs二分)

    [八省联考2018]林克卡特树 题目大意:给定一棵有负权边的树,现在必须恰好删去 k k k条边,并加上恰好 k k k条权值为 0 0 0的边,要求最大化它的直径长度. 首先考虑删去 K K K条边 ...

  5. 树形dp ---- 2018年杭电多校第二场 H travel

    题目大意: 就是给你一个带点权的树,找到3条独立互不相交的路径使得权值和最大 解题思路: 很经典的树形dp 我们设dp[root][j][k]dp[root][j][k]dp[root][j][k]表 ...

  6. QBXT 2018春季DP图论班 2018.5.4 --- 树形DP

    *张浩威老师授课* 树形DP:即在树上DP,用dp[i][]...表示以i为根的子树.....常从根DFS,递归转移dp数组. 没有上司的舞会-- 给定一棵有点权的二叉树,选择若干点,使得选出的点任意 ...

  7. LibreOJ #2478.「九省联考 2018」林克卡特树 树形dp+带权二分

    题意 给出一棵n个节点的树和k,边有边权,要求先从树中选k条边,然后把这k条边删掉,再加入k条边权为0的边,满足操作完后的图仍然是一棵树.问新树的带权直径最大是多少. n,k≤3∗105n,k≤3∗1 ...

  8. 2018年湖北省大学程序设计竞赛 D. Who killed Cock Robin(树形DP)

    题意:求无向树有多少个不同的子树.单点也算. 这道题比赛的时候公式对了,但是最后求和求错了,迷,也是思路没有完全理清楚. 树形dp,核心思想是合并子树. 由于无向,我们随意确定一个点为根,便确定了树的 ...

  9. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

最新文章

  1. Delphi开发的IOCP测试Demo以及使用说明。
  2. 单台主机 kafka + zookeeper 集群搭建
  3. ios 使用gcd 显示倒计时
  4. LeetCode 2151. 基于陈述统计最多好人数(状态压缩)
  5. MySQL---数据库从入门走向大神系列(二)-用Java对MySQL进行增删改查
  6. 智能指针(一):STL auto_ptr实现原理
  7. SQL server中如何使用return,break和continue
  8. 怎么在页面关闭时执行代码
  9. PHP动态网页设计:第2版pdf
  10. Weblogic部署项目
  11. 台式计算机对比评测报告,正常台式电脑测试报告.doc
  12. Kepp-alive的实际运用场景(1)
  13. 华尔街大神:跌势不止,做空不止,你把握住了吗?
  14. [Unity学习笔记:FPS游戏制作(1)]角色的移动,旋转与推进上升————(2021.6.13学习笔记)
  15. okHttp使用中报Could not find method java.nio.file.Files.newOutputStreamo警告问题
  16. 美团CodeM 资格赛第一题
  17. 简单理解二进制的左移和右移(通俗易懂)
  18. 90%的人都不知道网页文字被禁止如何复制,教你几招神奇技能就可以免费解决
  19. js遍历数组 循环json数组
  20. JS模板引擎sychelTemplate

热门文章

  1. linux与windows下tomcat的java内存设置
  2. 在JavaScript文件中读取properties文件的方法
  3. sed原理的一些感悟
  4. 58 Openstack基础、openstack之glance、openstack之keystone
  5. SegmentFault D-Day 北京:大数据
  6. 用SHELL脚本来防SSH和vsftpd暴力破解(第②版)
  7. 有用就存档,没用就删除,当日清理当日的email
  8. 博弈之 取石子1——6)
  9. 关于ConcurrentHashMap在jdk1.7的升级到1.8中的变化
  10. 近期在看的一段JS(谁能看出我想实现什么功能)