题目

维护每个点子树中最深的没有被覆盖的点(仅计算这条链上的关键点)的距离。

若\(u\)为关键点,则\(d_u=-k-1\)。

记录\(mx=\max\limits_{v\in son_u}d_v+1,min=\min\limits_{v\in son_u}d_v+1\)。

如果\(mx+mn<0\),那么说明这个点的子树已经全被覆盖了,那么\(d_u=mn\)。(这里是考虑到别的链上的关键点覆盖了这个点的子树)

否则这个点的子树没有全被覆盖,最深的没有被覆盖的点的深度依旧是\(mx\),\(d_u=mx\)。

如果\(d_u\ge k\),那么我们就在这个点设置一个关键点。

最后如果\(d_1\ge0\)就要继续答案加一。

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=1e5+1;
int n,k,ans,d[N];
vector<int>E[N];
int read(){int x;scanf("%d",&x);return x;}
void max(int &a,int b){a=a>b? a:b;}
void min(int &a,int b){a=a<b? a:b;}
void dfs(int u,int fa)
{
int mx=0,mn=k+1;
for(int v:E[u]) if(v^fa) dfs(v,u),max(mx,d[v]+1),min(mn,d[v]+1);
if((d[u]=(mx+mn<0? mn:mx))>=k) d[u]=-k-1,++ans;
}
int main()
{
n=read(),k=read(),read();int i,u,v;
for(i=1;i<n;++i) u=read(),v=read(),E[u].pb(v),E[v].pb(u);
if(dfs(1,0),d[1]>=0) ++ans;
return !printf("%d",ans);
}

最新文章

  1. iOS 关于PCH文件(全局文件)的介绍
  2. curl get
  3. jsoup
  4. CodeForces - 404A(模拟题)
  5. 解决phpMyAdmin中缺少mysqli扩展的错误
  6. 20160509-hibernate--继承映射
  7. 思维导图之C++语言程序设计总结
  8. css3中“渐变”兼容性解决方案
  9. Java并发编程--线程池
  10. POI读取excel工具类(xls,xlsx通用)
  11. 最好还是用#pragma once
  12. js+ajax编码三级联动
  13. css入门第一天
  14. [转] 前后端分手大师——MVVM 模式
  15. windows NT的意义和各个版本
  16. Python 自动发送邮件
  17. 北大poj- 1032
  18. jQuery-全屏滚动插件【fullPage.js】API 使用方法总结
  19. luoguP3920 [WC2014]紫荆花之恋 动态点分治 + 替罪羊树
  20. 用开源项目PhotoView实现图片的双指缩放和双击放大缩小

热门文章

  1. 51 Nod 1627瞬间移动(插板法!)
  2. Codeforces Round #584 - Dasha Code Championship - Elimination Round (rated, open for everyone, Div. 1 + Div. 2) G1. Into Blocks (easy version)
  3. JavaWeb_ XML文件
  4. 代理模式与AOP
  5. 20191031-2 Beta阶段贡献分配规则
  6. python利器之切片
  7. var $this = $(this)
  8. PHP基本语句
  9. visual studio运行时库MT、MTd、MD、MDd
  10. 正则表达式中常用的模式修正符有i、g、m、s、x、e详解