题意:一棵
一道暴力贪心题目。
因为
因此我们只用考虑深度大于
对于这些节点,我们按深度从大到小枚举,对于每个深度的叶节点,肯定在它上方
因此我们对于每个叶节点向上跳
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<ctime>
#include<vector>
#define INF 1e9
using namespace std;
const int maxn=1010;
const double Pi=acos(-1.0);
template<class T>void read(T &x)
{
x=0;int f=0;char ch=getchar();
while(ch<'0'||ch>'9') {f|=(ch=='-');ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
x=f?-x:x;
return;
}
int t,n,s,k,dep[maxn],f[maxn];
int head[maxn],cnt,vis[maxn],indgr[maxn];
struct node
{
int next;
int to;
}e[maxn<<1];
vector<int> p[maxn];
void add(int from,int to)
{
e[++cnt].next=head[from];
e[cnt].to=to;
head[from]=cnt;
}
void dfs(int u,int fa)
{
f[u]=fa;
dep[u]=dep[fa]+1;
if(indgr[u]==1&&dep[u]>k)
p[dep[u]].push_back(u);
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(v==fa)
continue;
dfs(v,u);
}
}
void mark(int u,int fa,int depth)
{
vis[u]=1;
if(depth>=k)
return ;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(v==fa)
continue;
mark(v,u,depth+1);
}
}
int solve()
{
int ans=0;
for(int d=n-1;d>k;d--)
for(int i=0;i<(int)p[d].size();i++)
{
int u=p[d][i];
if(vis[u])
continue;
int fa=u;
for(int j=1;j<=k;j++)
fa=f[fa];
mark(fa,0,0);
ans++;
}
return ans;
}
int main()
{
scanf("%d",&t);
while(t--)
{
memset(head,0,sizeof(head));
memset(indgr,0,sizeof(indgr));
memset(e,0,sizeof(e));
memset(vis,0,sizeof(vis));
memset(f,0,sizeof(f));
cnt=0;
for(int i=0;i<=maxn;i++)
p[i].clear();
scanf("%d%d%d",&n,&s,&k);
for(int i=1;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
indgr[a]++;
indgr[b]++;
add(a,b);
add(b,a);
}
dep[0]=-1;
dfs(s,0);
printf("%d\n",solve());
}
return 0;
}