这个题目关键在于把无根树变成有根树;这个用dfs;
然后用贪心的方法,从最深的那层开始,每次找到节点的上k层,建一个服务器,然后用一个dfs把这个服务器能够覆盖的节点标记;
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#define maxn 1005
using namespace std;
vector<int>node[maxn],deep[maxn];
bool vis[maxn];
int f[maxn],n,s,k;
void dfs(int x,int fa,int d)
{
f[x]=fa;
int l=node[x].size();
if(l==1&&d>k)deep[d].push_back(x);
for(int i=0;i<l;i++)
{
int v=node[x][i];
if(v!=fa)dfs(v,x,d+1);
}
}
void dfs2(int x,int fa,int d)
{
vis[x]=1;
int l=node[x].size();
for(int i=0;i<l;i++)
{
int v=node[x][i];
if(v!=fa&&d<k)dfs2(v,x,d+1);
}
}
int solve()
{
int ans=0;
memset(vis,0,sizeof vis);
for(int d=n-1;d>k;d--)
{
int l=deep[d].size();
for(int j=0;j<l;j++)
{
int v=deep[d][j];
if(!vis[v])
{
for(int i=0;i<k;i++)v=f[v];
dfs2(v,-1,0);
ans++;
}
}
}
return ans;
}
int main()
{
int t,x,y;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&s,&k);
for(int i=1;i<=n;i++)
{
node[i].clear();
deep[i].clear();
}
for(int i=0;i<n-1;i++)
{
scanf("%d%d",&x,&y);
node[x].push_back(y);
node[y].push_back(x);
}
dfs(s,-1,0);
printf("%d\n",solve());
}
return 0;
}