第一个dfs计算出叶结点的深度,第二个又来标记安放一个服务器后可以覆盖那些节点。
下面是代码:
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=1010;
int n,s,k,fa[maxn];
vector<int> gr[maxn],nodes[maxn];
bool cover[maxn];
void dfs(int u,int f,int d)
{
fa[u]=f;
if(gr[u].size()==1&&d>k)
nodes[d].push_back(u);
for(int i=0;i<gr[u].size();i++)
{
int v=gr[u][i];
if(v!=f)
dfs(v,u,d+1);
}
}
void dfs2(int u,int f,int d)
{
cover[u]=true;
for(int i=0;i<gr[u].size();i++)
{
if(gr[u][i]!=f&&d<k)
dfs2(gr[u][i],u,d+1);
}
}
int solve()
{
int ans=0;
memset(cover,0,sizeof(cover));
for(int d=n-1;d>k;d--)
{
for(int i=0;i<nodes[d].size();i++)
{
int u=nodes[d][i];
if(!cover[u])
{
int v=u;
for(int j=0;j<k;j++) v=fa[v];
dfs2(v,-1,0);
ans++;
}
}
}
return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int t;
cin>>t;
while(t--)
{
cin>>n>>s>>k;
for(int i=1;i<=n;i++)
{
gr[i].clear();
nodes[i].clear();
}
for(int i=0;i<n-1;i++)
{
int a,b;
cin>>a>>b;
gr[a].push_back(b);
gr[b].push_back(a);
}
dfs(s,-1,0);
cout<<solve()<<endl;
}
return 0;
}