开始把没被根节点影响到的叶子节点存起来 然后每次找深度最大的 往上k层的祖先 作为服务器 然后从这个服务器 开始dfs k层 除掉这些叶子节点 就可以了 我当时是处理的这个祖先的子孙 WA了2发 因为要去除其父节点方向的叶子
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<algorithm>
#include<set>
#define scnaf scanf
#define cahr char
#define bug puts("bugbugbug");
using namespace std;
typedef long long ll;
const int mod=1000000007;
const int maxn=2000+5;
const int inf=1e9;
const int maxe=200000;
int n,s,k;
int visit[maxn],F[maxn];
struct T
{
int id,cnt;
bool operator < (const T &b)const
{
return cnt>b.cnt;
}
};
vector<T>leaf;
vector<int>vec[maxn];
void init()
{
for(int i=0;i<=n;i++)
vec[i].clear();
leaf.clear();
memset(F,0,sizeof(F));
memset(visit,0,sizeof(visit));
}
void dfs(int id,int cnt,int fa)
{
F[id]=fa;
if(vec[id].size()<=1&&cnt>k)
leaf.push_back((T){id,cnt});
for(int i=0;i<vec[id].size();i++)
if(vec[id][i]!=fa)
dfs(vec[id][i],cnt+1,id);
}
void go(int id,int cnt)
{
if(cnt>k)return ;
visit[id]=1;
for(int i=0;i<vec[id].size();i++)
go(vec[id][i],cnt+1);
}
int main()
{
int T_T;
scnaf("%d",&T_T);
while(T_T--)
{
scanf("%d%d%d",&n,&s,&k);
init();
for(int i=1;i<n;i++)
{
int a,b;
scnaf("%d%d",&a,&b);
vec[a].push_back(b);
vec[b].push_back(a);
}
dfs(s,0,0);
int ans=0;
sort(leaf.begin(),leaf.end());
for(int i=0;i<leaf.size();i++)
if(!visit[leaf[i].id])
{
int now=leaf[i].id;
int cnt=0;
while(F[now]!=0&&cnt++<k)
now=F[now];
go(now,0);
ans++;
}
printf("%d\n",ans);
}
return 0;
}