将度为1的顶点加入队列,做拓扑排序,记录点的遍历层次,答案为 n-前k层的点的数量
// AC one more times
void solve()
{
int n; cin>>n;
int k; cin>>k;
int st[n+10];memset(st,0,sizeof st);
vector<int> son[n+10];
int d[n+10];memset(d,0,sizeof d);
for(int i=1;i<=n+3;i++)
son[i].clear();
for(int i=1;i<=n-1;i++)
{
int u,v; cin>>u>>v;
son[u].pb(v);
son[v].pb(u);
d[u]++,d[v]++;
}
queue<int> q;
for(int i=1;i<=n;i++)
{
if(d[i]==1)
q.push(i),st[i]=1;
}
while(!q.empty())
{
int t=q.front(); q.pop();
for(auto &it:son[t])
{
int j=it;
if(--d[j]==1)
{
st[j]=st[t]+1;
q.push(j);
}
}
}
int ans=0;
for(int i=1;i<=n;i++)
if(st[i]<=k) ans++;
cout<<n-ans<<endl;
return;
}
int main()
{
std::ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr);
int T;cin>>T;while(T--)
solve();
return 0;
}
本文来自博客园,作者:magicat,转载请注明原文链接:https://www.cnblogs.com/magicat/p/16535716.html