传送门

题目描述

思路

  1. 求一下每个结点的所有分支路径中第二长的那条路径的长度,如果长度大于K,那么k次操作后这个结点就会被保留。

  2. 做两次dfs第一次,沿着这个固定结点往下搜索,求得最长路径长度,并且记录当前结点的最长路径是来自哪个结点的(第二次搜索会用到)。

  3. 为什么做两次搜索
    第一次搜索后除了第一个结点,其它结点的最长路径都没有考虑到其经过父节点的那条路径,所以要再用第一次的根节点搜索一次,对每个结点,考虑父节点路径对它的第二长路径答案的影响,要特判父节点的最长路是不是就是自己的路径对其的贡献,如果是,就考虑父节点次长路径,对当前结点的次长路径的影响。

具体实现看代码

#include<bits/stdc++.h>
using namespace std;
const int N = 4E5 + 10;
int ma[N],h[N],to[N << 1],ne[N << 1],dp1[N],dp2[N];
// ma数组记录当前结点的最长路径来自哪个子结点
//dp1数组记录最长路径长度,dp2记录次长路径长度int cnt = 0;
void add(int x,int y){to[++cnt] = y;ne[cnt] = h[x];h[x] = cnt;
}int dfs(int u,int fa){dp1[u] = dp2[u] = 1;int d1,d2; d1 = d2 = 0;for(int i = h[u]; ~i; i = ne[i]){int v = to[i];if(v == fa)continue;int d = dfs(v,u) + 1;if(d > d1) d2 = d1,d1 = d,ma[u] = v;else if(d > d2)   d2 = d;}dp1[u] = max(d1,1);dp2[u] = max(d2,1);return dp1[u];
}void dfs_f(int u,int fa){if(~fa){if(ma[fa] != u){if(dp1[fa] + 1 > dp1[u]){dp2[u] = dp1[u];dp1[u] = dp1[fa] + 1;}}else if(dp2[fa] + 1 > dp1[u]){dp2[u] = dp1[u];dp1[u] = dp2[fa] + 1;}else dp2[u] = max(dp2[u],dp2[fa] + 1);}for(int i = h[u]; ~i; i = ne[i]){int v = to[i];if(v == fa)continue;dfs_f(v,u);}
}int main(){int T;  cin >> T;while(T--){int n,k;  cin >> n >> k;memset(h,-1,sizeof h);cnt = 0;for(int i = 1; i < n; ++i){int x,y;  cin >> x >> y;add(x,y); add(y,x);}dfs(1,-1);// 第一次搜索求最短路 和 最长路dfs_f(1,-1);//第二次搜索对每个结点考虑父节点对该结点答案的影响int ans = 0;for(int i = 1; i <= n; ++i){// 如果次长路径长度大于k那么这个结点最后就可以被保留if(dp2[i] > k)   ++ans;     }cout << ans << '\n';}return 0;
}

E. Gardener and Tree 树形DP相关推荐

  1. 2021牛客多校4 - Rebuild Tree(树形dp)

    题目链接:点击查看 题目大意:给出一棵 nnn 个节点的树,现在可以删掉 kkk 条边,然后加上 kkk 条边,问有多少种方案使得操作后 nnn 个点仍然是一棵树 题目分析:原树删掉 kkk 条边后会 ...

  2. hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)

    题目链接: Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: ...

  3. HDU 5834 Magic boy Bi Luo with his excited tree 树形DP

    Magic boy Bi Luo with his excited tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5834 Descript ...

  4. BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)

    BZOJ orz MilkyWay天天做sxt! 首先可以树形DP:\(f[i][j][0/1]\)表示\(i\)个点的子树中,黑高度为\(j\),根节点为红/黑节点的最小红节点数(最大同理). 转移 ...

  5. LiberOJ #6210. 「美团 CodeM 决赛」tree 树形DP

    题目链接:点这里 题解: 需要证明,所求的路径一定是全部权值都为1或者,路径上权值至多有一个为2其余为1且权值2在路径中央. 然后树形DP 设定dp[i][0/1] 以1为根的情况下,以i 节点下子树 ...

  6. Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp

    链接: http://codeforces.com/contest/462/problem/D 题意: 给定n个点的树, 0为根,下面n-1行表示每个点的父节点 最后一行n个数 表示每个点的颜色,0为 ...

  7. VK Cup 2012 Round 1 D. Distance in Tree (树形dp)

    题目:http://codeforces.com/problemset/problem/161/D 题意:给你一棵树,问你两点之间的距离正好等于k的有多少个 思路:这个题目的内存限制首先大一倍,他有5 ...

  8. ARC101E Ribbons on Tree 树形dp 容斥

    题目链接 题意: 给你一棵nnn个点的树,nnn是偶数,把这些点分成n2\frac{n}{2}2n​个点对,每个点对会把路径上的所有边覆盖,问你每条边至少覆盖一次有多少种配对方式.n<=5000 ...

  9. A. Parsa‘s Humongous Tree(树形DP + 贪心)

    Problem - 1528A - Codeforces 两个玩家正在玩一个游戏.他们有一个整数1,2,...,n的排列组合(排列组合是一个数组,其中从1到n的每个元素正好出现一次).这个排列组合没有 ...

最新文章

  1. BEncode编码方式以及torrent文件的一些内容
  2. RocketMQ:消息消费队列与索引文件的实时更新以及文件恢复源码解析
  3. [route]Add up route for deb rpm and windows / 为RPM系DEB系和Windows添加路由
  4. OpenCv:椭圆上点的计算方程
  5. 安卓代码迁移:Program sh not found in PATH
  6. 读入自然数m、n,判断m/n是有限小数还是循环小数
  7. python清空idle的内容_Python IDLE清空窗口的实例
  8. 线性代数:矩阵运算之乘法?
  9. php列出mysql表格,php列出mysql表所有行和列的方法
  10. python免费领取视频-最经典Python爬虫全套视频免费领,带你从0开始学爬虫
  11. 3.面试(3) --- 编程
  12. 操作系统 信号量机制
  13. 艾永亮:经济型酒店风光不再,亚朵锁定中端酒店市场打造超级产品
  14. 微信JSAPI几个函数介绍
  15. 程序员也学点财报--《一本书读懂财报》脑图
  16. EuroSys'14 会议记录
  17. 计算机物理学论文300字,物理考试反思范文300字(精选6篇)
  18. zookeeper设置密码
  19. Linux问题:Cannot prepare internal mirrorlist: No URLs in mirrorlist
  20. 线性代数的一些知识点

热门文章

  1. Linux学习之deepin linux安装与配置
  2. 3DMAX 6 游戏特效制作
  3. CAA二次开发常用代码块
  4. 前端agl分页的写法
  5. matlab 圆锥投影,MATLAB 表达式 2*2^(3^2) 的结果是 (    )
  6. 经典算法之不定方程问题
  7. <概率论与数理统计>中各种符号的名称
  8. bzoj3572世界树 虚树+树型动规
  9. Flutter 贝塞尔曲线实现案例
  10. 谷歌全球大裁员,涉及1.2万人