本蒟蒻刚刚打了CF div3,E 题的做法是,把叶子加到队列里,跑bfs,统计每个点距离最近的叶子的距离,然后去和操作次数比较,统计答案,结果T了
蒟蒻脑子晚上可能晕了,所以算法错了请和善指出qwq
如果算法没错有没有大佬帮看一下代码qwq
#include<bits/stdc++.h>
using namespace std;
int n,opt;
const int N=400010;
int h[N],nex[2*N],to[2*N],cnt;
void add(int x,int y){
cnt++;
nex[cnt]=h[x];
to[cnt]=y;
h[x]=cnt;
}
int deg[N];
int d[N];//距离最近的叶子
int q[N*10];
int head;
int tail;
bool v[N];
void bfs(){
while(head<=tail){
int x=q[head];
head++;
for(int i=h[x];i;i=nex[i]){
int y=to[i];
if(v[y])
continue;
d[y]=d[x]+1;
v[y]=1;
tail++;
q[tail]=y;
}
}
}
int main(){
//freopen("E. Gardener and Tree.in","r",stdin);
//freopen("E. Gardener and Tree.out","w",stdout);
int T;
cin>>T;
while(T--){
scanf("%d%d",&n,&opt);
memset(h,0,sizeof(h));
memset(nex,0,sizeof(nex));
memset(deg,0,sizeof(deg));
memset(d,0x3f,sizeof(d));
memset(v,0,sizeof(v));
if(n==1){
puts("0");
continue;
}
cnt=1;
for(int i=1;i<=n-1;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
deg[x]++;
deg[y]++;
}
head=1;
tail=0;
for(int i=1;i<=n;i++){
if(deg[i]!=1)
continue;
d[i]=0;
tail++;
q[tail]=i;
v[i]=1;
}
bfs();
int ans=0;
for(int i=1;i<=n;i++)
if(d[i]>=opt)
ans++;
printf("%d\n",ans);
}
return 0;
}