典型的树形。
具体思路参考题解
注意:
中,开始一直觉得没有用,用不就好了吗?反正你要推到的不是的儿子吗!
结果一直
其实呢,在这个搜索中,它的起点不是1可以是任意一个节点
如果还按开始的那个的话肯定是不行的
成立仅限于搜索过程是以为节点的深度优先搜索
所以一定要记录
#include <bits/stdc++.h>
#define ll long long
#define maxn 200005
using namespace std;
ll n,k,t,hd[maxn],tt=0,u,v,dh[maxn],fa[maxn],vit[maxn],ans;
struct Node{
ll to,nx;
}e[maxn<<1];
struct node{
ll fm,dp;
}q[maxn<<1];
inline ll read(){
ll x=0,f=0;
char c=getchar();
while(!isdigit(c))
f|=c=='-',c=getchar();
while(isdigit(c))
x=(x<<1)+(x<<3)+(c^48),c=getchar();
return f?-x:x;
}
inline void add(ll u,ll v){
e[++tt].to=v;
e[tt].nx=hd[u];
hd[u]=tt;
}
inline void dfs1(ll x){
for(register int i=hd[x];i;i=e[i].nx){
ll u=e[i].to;
if(!dh[u]){
fa[u]=x;
dh[u]=dh[x]+1;
dfs1(u);
}
}
}
inline ll find(ll x){
ll sp=1;
while(sp<=k){
++sp;
x=fa[x];
}
return x;
}
inline void dfs2(ll x,ll pre,ll sp){
vit[x]=1;
if(sp==k) return;
for(register int i=hd[x];i;i=e[i].nx){
ll u=e[i].to;
if(u!=pre) dfs2(u,x,sp+1);
}
}
inline bool cmp(node a,node b){
return a.dp>b.dp;
}
int main(){
n=read();k=read();t=read();
for(register int i=1;i<n;++i){
u=read();v=read();
add(u,v);add(v,u);
}
dh[1]=1;fa[1]=1;dfs1(1);
for(register int i=1;i<=n;++i){
q[i].fm=i;
q[i].dp=dh[i];
}
sort(q+1,q+n+1,cmp);
for(register int i=1;i<=n;++i){
node xx=q[i];
int x=xx.fm;
if(vit[x]) continue;
++ans;
ll y=find(x);
dfs2(y,0,0);
}
printf("%lld\n",ans);
return 0;
}